强连通分量Tarjan模板
2013-08-10 11:50
357 查看
#include<iostream> #include<stdio.h> #include<string.h> #include<stack> #include<vector> #include<algorithm> #define N 1000 using namespace std; int pre ,lowlink ,sccno ,dfn_clock,scc_cnt; stack<int> stk; vector<int> G ; void DFN(int u) { pre[u] = lowlink[u] = ++dfn_clock; //时间戳 stk.push(u); int i; for(i=0;i<G[u].size();i++) { int v = G[u][i]; if(!pre[v]) //没有访问过 { DFN(v); lowlink[u] = min(lowlink[u],lowlink[v]); } else if(!sccno[v]) //被访问过,但是不是其他强连通图的组成 { lowlink[u] = min(lowlink[u],pre[v]); } } if(lowlink[u]==pre[u]) //发现一个强连通分量 { scc_cnt++; //强连通分量的个数计算 while(1) { int x = stk.top(); stk.pop(); sccno[x] = scc_cnt; if(x==u) break; } } } void find_scc(int n) { dfn_clock = scc_cnt = 0; memset(sccno,0,sizeof(sccno)); memset(pre,0,sizeof(pre)); int i; for(i=1;i<=n;i++) if(!pre[i]) DFN(i); } int main() { int n,m; scanf("%d%d",&n,&m); int i; for(i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); G[a].push_back(b); //构造图 } find_scc(n); //查找强连通图 for(i=1;i<=n;i++) printf("%d ",sccno[i]); putchar(10); return 0; } /* //测试用图 6 8 1 3 3 5 5 6 3 4 4 6 4 1 1 2 2 4 */
相关文章推荐
- HDU 1269 迷宫城堡【Tarjan强连通分量 模板】
- 【模板】Tarjan求强连通分量
- 强连通分量Kosaraju、Tarjan【模板】
- 连通分量模板:tarjan: 求割点 && 桥 && 缩点 && 强连通分量 && 双连通分量 && LCA(最近公共祖先)
- [POJ 3180] The Cow Prom Tarjan求强连通分量 模板题
- 【模板】【强连通分量】【Tarjan】
- Tarjan模板 求割点数+桥+连通分量数 来自kuangbin
- hdu1269迷宫城堡(tarjan求强连通分量模板)
- hdu1269 Tarjan强连通分量 模板(转)
- tarjan 算法模板(边连通分量)
- 连通分量模板:tarjan: 求割点 && 桥 && 缩点 && 强连通分量 && 双连通分量 && LCA(近期公共祖先)
- tarjan 边连通分量+2-sat 模板
- 有向图强连通分量Tarjan模板
- 二分图强连通分量 tarjan 模板
- tyvj 1111 舞会 有向图强连通分量 Kosaraju模板 tarjan模板
- hdu 1269 Tarjan强连通分量 模板
- hdu1269 Tarjan强连通分量 模板
- tarjan求强连通分量专题
- 【日常学习】【强连通分量tarjan缩点】codevs1611 抢掠计划题解
- -----tarjan强连通分量缩点-hdu 5934 -Bomb