题目链接:http://poj.org/problem?id=1611
题目大意:
有一个学校,有N个学生,编号为0-N-1,现在0号学生感染了非典,凡是和0在一个社团的人就会感染,并且这些人如果还参加了别的社团,他所在的社团照样全部感染,求感染的人数。
这道题是并查集的题目。没什么好多说的比较简单~
#include<stdio.h> int set[30005],h[30005],num[30005]; void init(int m) { int i; for(i = 0;i < m;i++) { set[i] = i; h[i] = 0; num[i] = 1; } } int find(int x)//怕数据比较大所以直接用的循环,如果用栈的话会可能会出现re { int r= x; while(set[r] != r) { r = set[r]; } return r; } void merge(int a,int b) { a = find(a); b = find(b); if(a == b)//这部一定要有,我因为这个wa了一次 return; if(h[a] == h[b]) h[a] = h[a]+1,set[b] = a,num[a] += num[b]; else if(h[a] < h[b]) set[a] = b,num[b] += num[a]; else set[b] = a,num[a] += num[b]; } int main() { int n,m,i,j,t,a,b; while(scanf("%d %d",&n,&m)&&n||m) { init(n); if(!m) printf("1\n"); else { while(m--) { scanf("%d",&t); for(scanf("%d",&a),i = 1;i < t;i++)//嘿嘿,跟网上雪莱的~ { scanf("%d",&b); merge(a,b); } } printf("%d\n",num[find(0)]); } } return 0; }