TYVJ 1111 舞会 强联通分量版解题报告
终于琢磨出来了强联通分量,看了不少资料啊~~有三种算法,我用的第一种,最慢的,但是也是最普遍的。。
具体讲解看我转的一篇文章吧,代码如下:
#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; }