首页 > 其他 > 详细

Tarjan 求强连通分量刘汝佳模板

时间:2015-03-08 21:17:31      阅读:322      评论:0      收藏:0      [点我收藏+]
 1 vector<int> G[MAXN];
 2 int pre[MAXN], lowlink[MAXN], sccno[MAXN], dfs_clock, scc_cnt;
 3 stack<int> S;
 4 void Tarjan(int u)
 5 {
 6     pre[u] = lowlink[u] = ++dfs_clock;
 7     S.push(u);
 8     for (int i = 0; i < G[u].size(); ++i) {
 9         int v = G[u][i];
10         if (!pre[v]) {
11             Tarjan(v);
12             lowlink[u] = min(lowlink[u], lowlink[v]);
13         }
14         else if (!sccno[v]) {
15             lowlink[u] = min(lowlink[u], pre[v]);
16         }
17     }
18     if (lowlink[u] == pre[u]) {
19         scc_cnt++;
20         int x;
21         do {
22             x = S.top(); 
23             S.pop();
24             sccno[x] = scc_cnt;
25             if (x == u) break;
26         } while (x != u);
27     }
28 }
29 
30 void find_scc(int n)
31 {
32     dfs_clock = scc_cnt = 0;
33     memset(sccno,0,sizeof(sccno));
34     memset(pre,0,sizeof(pre));
35     for (int i = 0; i < n; ++i)
36         if (!pre[i]) Tarjan(i);
37 }

 

Tarjan 求强连通分量刘汝佳模板

原文:http://www.cnblogs.com/usedrosee/p/4322168.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!