终于琢磨出来了强联通分量,看了不少资料啊~~有三种算法,我用的第一种,最慢的,但是也是最普遍的。。
具体讲解看我转的一篇文章吧,代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int num[200];
int map[200][200];
int count[200];
int rmap[200][200];
int rcount[200];
int group[200];
int order[200];
int flag[200];
int now;
void srch1(int i)
{
int j;
flag[i] = 1;
for(j = 0; j < count[i]; j++){
if(!flag[map[i][j]]){
srch1(map[i][j]);
}
}
order[++now] = i;
}
void srch2(int i, int k)
{
int j;
flag[i] = 1;
group[i] = k;
for(j = 0; j < rcount[i]; j++){
if(!flag[rmap[i][j]]){
srch2(rmap[i][j], k);
}
}
}
int main(int argc, char **argv)
{
int i;
int n;
scanf("%d", &n);
for(i = 0; i < n; i++){
do{
scanf("%d", &num[i]);
if(num[i] == 0){
break;
}
num[i]--;
map[i][count[i]++] = num[i];
rmap[num[i]][rcount[num[i]]++] = i;
}while(1);
}
memset(flag, 0, sizeof(flag));
for(i = 0; i < n; i++){
if(!flag[i]){
srch1(i);
}
}
memset(flag, 0, sizeof(flag));
for(now = 0, i = n; i >= 1; i--){
if(!flag[order[i]]){
srch2(order[i], ++now);
}
}
printf("%d\n", now);
return 0;
}