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 }