c_cpp 找到无向图的k核
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 找到无向图的k核相关的知识,希望对你有一定的参考价值。
#include <bits/stdc++.h>
using namespace std;
class graph {
int v;
list <int> *adj;
public:
graph (int v) {
this->v = v;
adj = new list<int> [v];
}
void addEdge (int u, int w) {
adj[u].push_back(w);
adj[w].push_back(u);
}
void print();
void kCores (int k);
bool DFSUtil(int , vector <bool> &, vector <int> &, int );
};
void graph::print() {
for (int i=0;i<v; i++) {
cout<< i ;
list<int>::iterator j;
for (j= adj[i].begin(); j!= adj[i].end(); ++j)
cout<< " - " << *j;
cout<< "\n";
}
}
bool graph::DFSUtil(int s, vector<bool> &visited, vector<int> &d, int k) {
visited[s] = 1;
list<int>::iterator i;
for (i= adj[s].begin(); i!= adj[s].end(); ++i) {
if (d[s]<k)
d[*i]--;
if (!visited[*i]) {
if (DFSUtil(*i, visited, d, k))
d[s]--;
}
}
return (d[s]<k);
}
void graph::kCores(int k) {
vector <bool> visited(v, false);
vector <int> d(v);
int mdeg = INT_MAX, s;
for (int i=0; i<v; i++) {
d[i] = adj[i].size();
if (d[i]< mdeg) {
mdeg = d[i];
s = i;
}
}
DFSUtil(s, visited, d, k);
for (int i=0; i<v; i++)
if (!visited[i])
DFSUtil(i, visited, d, k);
for (int i=0; i<v;i++) {
if (d[i]>= k) {
cout<< i;
list<int>::iterator j;
for (j= adj[i].begin(); j!= adj[i].end(); ++j)
if (d[*j]>= k)
cout<< " - "<< *j;
cout<< "\n";
}
}
}
int main() {
int k=3, v= 9;
graph g(v);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(1, 5);
g.addEdge(2, 3);
g.addEdge(2, 4);
g.addEdge(2, 5);
g.addEdge(2, 6);
g.addEdge(3, 4);
g.addEdge(3, 6);
g.addEdge(3, 7);
g.addEdge(4, 6);
g.addEdge(4, 7);
g.addEdge(5, 6);
g.addEdge(5, 8);
g.addEdge(6, 7);
g.addEdge(6, 8);
g.print();
cout<< "-----------------------------\n";
g.kCores(k);
}
以上是关于c_cpp 找到无向图的k核的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp needtodo在无向图中找到两个给定节点之间的第二条最短路径
CF932ETeam Work/BZOJ5093图的价值 数学+NTT
无向图的连通分量
无向图的割点
寻找无向图的最重路径
[Data Structure & Algrithom] 无向图的最小生成树