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;
}
posted @ 2011-08-05 20:13  zqynux  阅读(171)  评论(0编辑  收藏  举报