Laughing

 

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;
}

posted on 2011-10-24 13:25  巨富一生  阅读(115)  评论(0编辑  收藏  举报

导航