您的位置:首页 > 其它

强连通分量 Kosaraju算法

2012-04-23 10:14 375 查看


#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");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: