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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值