poj 1611 边输入边合并
题目大意:
一共有n个学生(编号0 至 n-1),m个组,一个学生可以同时加入不同的组。
现在有一种传染病,如果一个学生被感染,那么和他同组的学生都会被感染。现在已
知0号学生被感染,问一共有多少个人被感染。
思路:刚开始我想,先输入将他们合并入一个集合m,如果遇到0则将所有的放入0这个集合,再查找。总之很难实现。
看了代码后,才发现别人思路的高明之处:一边输入,一边合并,最后输出b[0]即可。
代码:
#include<stdio.h>
short a[30000],b[30000];
int f(int i)
{
if(a[i]==i) return i;
return a[i]=f(a[i]);
}
void u(int i,int j)
{
i=f(i),j=f(j);
if(i==j) return;
if(i<j) a[j]=i,b[i]+=b[j];
else a[i]=j,b[j]+=b[i];
}
int main()
{
int n,m,i,f,k;
while(scanf("%d%d",&n,&m)&&(n||m))
{
for(i=0;i<n;i++) a[i]=i,b[i]=1;
while(m--)
{
scanf("%d",&k);
if(k) scanf("%d",&f);
while(--k) scanf("%d",&i),u(f,i);
}
printf("%d\n",b[0]);
}
return 0;
}