强连通分量(LRJ训练指南)
2013-08-27 19:32
274 查看
#include <iostream> #include <queue> #include <string> #include <cstdio> #include <cstring> #include <vector> #include <stack> #include <algorithm> using namespace std; const int maxn = 10000; int gn, gm; vector<int> gg[maxn]; int pre[maxn], low[maxn], sccno[maxn], dfs_clock, scc_cnt; stack<int> gs; void dfs(int u) { int i; pre[u] = low[u] = ++dfs_clock; gs.push(u); for(i = 0; i < (int)gg[u].size(); i++) { int v = gg[u][i]; if(!pre[v]) { dfs(v); low[u] = min(low[u], low[v]); } else if(!sccno[v]) { low[u] = min(low[u], low[v]);//min(low[u], low[v]); } } if(low[u] == pre[u]) { scc_cnt++; for(;;) { int x = gs.top(); gs.pop(); sccno[x] = scc_cnt; if(x == u) break; } } } void find_scc(int n) { dfs_clock = scc_cnt = 0; memset(sccno, 0, sizeof(sccno)); memset(pre, 0, sizeof(pre)); for(int i = 1; i <= n; i++) { if(!pre[i]) dfs(i); } } void print() { for(int i = 1; i <= gn; i++) { printf("i = %d -> %d\n", i, sccno[i]); } } int main() { int from, to; while(scanf("%d%d", &gn, &gm) ==2) { for(int i = 0; i < gm; i++) { scanf("%d%d", &from, &to); gg[from].push_back(to); } find_scc(gn); print(); } return 0; } /** 11 16 1 2 2 3 2 5 3 4 4 3 4 7 5 2 5 4 5 6 6 7 6 10 7 8 8 9 9 10 10 11 11 6 ***/
相关文章推荐
- 强连通分量(LRJ训练指南)
- LA3644,LA3027 并查集,LRJ训练指南
- 强连通分量SCC模版(LRJ)
- 强连通分量[trajan]
- 来个强连通分量的
- 强连通分量 Tarjan
- CCF——高速公路(有向强连通分量)
- 有向图强连通分量 Tarjan算法【java实现】
- 有向图强连通分量 Tarjan算法【java实现】
- 【CodeVS】2822 爱在心中 [2017年6月计划 强连通分量03]
- HDU 1269 迷宫城堡(裸强连通分量,3级)
- 强连通分量 模板
- 有向图的强连通分量的tarjan算法总结
- HDU 1269 迷宫城堡 强连通分量模板题
- HDU 4612 Warm up(无向图强连通分量缩点建树)
- POJ 3207 Ikki's Story IV - Panda's Trick 强连通分量或并查集+2sat
- 【bzoj2438】【中山市选2011】【杀人游戏】【强连通分量缩点】
- poj 2186 Popular Cows 有向图强连通分量 tarjan
- 《算法竞赛-训练指南》第一章-1.11——Uva 10795
- 《算法竞赛-训练指南》第一章-1.19_UVa 11549