ACM模板——强连通分量

 1 vector<int> G[maxn];
 2 vector<int> rG[maxn];
 3 vector<int> vs;
 4 vector<int> ans[maxn];
 5 bool used[maxn];
 6 int V,E;
 7 int rnt = 0;
 8 void add_edge(int from,int to)
 9 {
10     G[from].pb(to);
11     rG[to].pb(from);
12 }
13 void dfs(int v)
14 {
15     used[v] = true;
16     _for(i,0,G[v].size())
17         if(!used[G[v][i]])
18             dfs(G[v][i]);
19     vs.pb(v);
20 }
21 void rdfs(int v,int k)
22 {
23     used[v] = true;
24     ans[k].pb(v);
25     _for(i,0,rG[v].size())
26         if(!used[rG[v][i]])
27             rdfs(rG[v][i],k);
28 }
29 //第k个集合里有哪些节点 ans[k]
30 //rnt为最大集合的集合大小
31 void Kosaraju()
32 {
33     memset(used,0,sizeof(used));
34     _for(v,1,V+1)
35         if(!used[v])
36             dfs(v);
37     
38     memset(used,0,sizeof(used));
39     int k = 0;
40     _rep(i,vs.size()-1,-1)
41         if(!used[vs[i]])
42         {
43             rdfs(vs[i],k);
44             rnt = max(rnt,(int)ans[k].size());
45             k ++;
46         }
47 }
Kosaraju

 

转载于:https://www.cnblogs.com/Asurudo/p/11536005.html

你可能感兴趣的:(ACM模板——强连通分量)