您的位置:首页 > 其它

TYVJ 1111 舞会 强联通分量版解题报告

2011-08-07 21:08 411 查看
  终于琢磨出来了强联通分量,看了不少资料啊~~有三种算法,我用的第一种,最慢的,但是也是最普遍的。。

  具体讲解看我转的一篇文章吧,代码如下:

#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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: