int N, M;
vector<int> G[MAX];
vector<int> rG[MAX];
vector<int> vs;
bool used[MAX];
int cmp[MAX];
void add_edge(int from, int to){
G[from].push_back(to);
rG[to].push_back(from);
}
void dfs(int v) {
used[v] = true;
for(int i = 0; i < G[v].size(); i++) {
if(!used[G[v][i]]) dfs(G[v][i]);
}
vs.push_back(v);
}
void rdfs(int v, int k) {
used[v] = true;
cmp[v] = k;
for(int i = 0; i < rG[v].size(); i++) {
if(!used[rG[v][i]]) rdfs(rG[v][i], k);
}
}
int scc() {
memset(used, 0, sizeof(used));
vs.clear();
for(int i = 0; i < N; i++) {
if(!used[i]) dfs(i);
}
memset(used, 0, sizeof(used));
int k = 0;
for(int i = vs.size() - 1; i >= 0; i--) {
if(!used[vs[i]]) rdfs(vs[i], k++);
}
return k;
}
强连通-kasaraju算法模板
最新推荐文章于 2023-06-16 14:44:51 发布