强连通分量 Kosaraju算法
2012-04-23 10:14
441 查看
#include "stdio.h" #include "string.h" #define M 20 int map[M][M]; int n, m; int mark[M]; int rank[M]; int pos; int scc; int all[M]; void init(){ int i; int u, v; memset(map, 0, sizeof(map)); for(i=0; i<m; i++){ scanf("%d %d", &u, &v); map[u][v] = 1; } } void revers(){ int i, j, t; for(i=0; i<n; i++) for(j=0; j<i; j++){ t = map[i][j]; map[i][j] = map[j][i]; map[j][i] = t; } } void DFS(int u){ int i; mark[u] = 1; for(i=0; i<n; i++){ if(!mark[i] && map[u][i]) DFS(i); } rank[pos++] = u; } void _DFS(int u){ int i; mark[u] = 1; for(i=0; i<n; i++){ if(!mark[i] && map[u][i]) _DFS(i); } all[u] = scc; } void main(){ int i, j; freopen("in.txt", "r", stdin); while(scanf("%d %d", &n, &m)!=EOF){ init(); pos = 0; memset(mark, 0, sizeof(mark)); for(i=0; i<n; i++){ if(!mark[i]) DFS(i); } revers(); scc = 1; memset(mark, 0, sizeof(mark)); memset(all, 0, sizeof(all)); for(i=--pos; i>=0; i--){ if(!mark[rank[i]]){ _DFS(rank[i]); scc++; } } for(i=1; i<scc; i++){ for(j=0; j<n; j++){ if(all[j]==i) printf("%d ", j); } printf("\n"); } } }
相关文章推荐
- 有向图----强连通分量问题(Kosaraju算法)
- 强连通分量(Kosaraju算法)
- [图论] 有向图强连通分量 (kosaraju算法,Tarjan算法)
- 强连通分量 Kosaraju算法
- 求有向图的强连通分量个数 之 Kosaraju算法
- poj2186Popular Cows(Kosaraju算法--有向图的强连通分量的分解)
- 强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)
- 强连通分量——[Kosaraju算法]
- 强连通分量——Kosaraju算法
- Kosaraju算法解析: 求解图的强连通分量
- 有向图的强连通分量之Kosaraju算法
- 一句话之--tarjan算法、kosaraju算法,求强连通分量
- 强连通分量 -- Kosaraju算法
- 有向图强连通分量的Tarjan算法和Kosaraju算法
- 强连通分量_Kosaraju算法
- 强连通分量——kosaraju算法
- 强连通分量-kosaraju算法
- 强连通分量Kosaraju算法
- 强连通分量的Kosaraju算法
- 求强连通分量——Tarjan、Kosaraju算法