poj 1611 并查集

题意:学校里有若n个学生,被分为m组,一个学生可以参加多个组,其中0号学生受到感染,求和他接触或者间接接触的人的数目

链接:点我

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <string.h>
 5 using namespace std;
 6 
 7 const int MAXN=30010;
 8 int F[MAXN];
 9 int num[MAXN];
10 int find(int x)
11 {
12     if(F[x]==-1)return x;
13     return F[x]=find(F[x]);
14 }
15 void bing(int x,int y)
16 {
17     int t1=find(x);
18     int t2=find(y);
19     if(t1!=t2)
20     {
21         F[t1]=t2;
22         num[t2]+=num[t1];
23     }
24 }
25 int main()
26 {
27     int n,m;
28     int a,a0;
29     int i,j,k;
30     #ifndef ONLINE_JUDGE
31     freopen("1.in","r",stdin);
32     #endif
33     while(scanf("%d%d",&n,&m)!=EOF)
34     {
35         if(n==0&&m==0)  break;
36         for(i=0;i<n;i++)
37         {
38             F[i]=-1;
39             num[i]=1;
40         }
41         for(i=0;i<m;i++)
42         {
43             scanf("%d",&k);
44             for(j=0;j<k;j++)
45             {
46                 if(j==0)
47                 {
48                     scanf("%d",&a0);
49                 }
50                 else
51                 {
52                     scanf("%d",&a);
53                     bing(a,a0);
54                 }
55 
56             }
57         }
58         printf("%d\n",num[find(0)]);
59 
60     }
61     return 0;
62 }

 

posted @ 2015-05-04 17:06  miao_a_miao  阅读(151)  评论(0编辑  收藏  举报