我直接暴力搜的,还有一个强连通分量的算法,琢磨一下,明天写:
#include <stdio.h>
#include <stdlib.h>
#define INF 0xFFFFFFF
int map[200][200];
int count[200];
int group[200];
int n;
void mark(int i, int k)
{
int j;
if(group[i] == k){
return;
}
group[i] = k;
for(j = 0; j < n; j++){
if(map[i][j] != INF && map[j][i] != INF){
mark(j, k);
}
}
}
int main(int argc, char **argv)
{
int i, j, k;
int a;
scanf("%d", &n);
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
if(i != j){
map[i][j] = INF;
}
}
}
for(i = 0; i < n; i++){
while(1){
scanf("%d", &a);
if(a == 0){
break;
}
map[i][a - 1] = 1;
}
}
for(k = 0; k < n; k++){
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
if(map[i][j] > map[i][k] + map[k][j]){
map[i][j] = map[i][k] + map[k][j];
}
}
}
}
for(i = k = 0; i < n; i++){
if(group[i] == 0){
mark(i, ++k);
}
}
printf("%d\n", k);
return 0;
}