TYVJ 1111 舞会 解题报告
我直接暴力搜的,还有一个强连通分量的算法,琢磨一下,明天写:
#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; }