POJ - 1611
1 #include<iostream>
2 #include<algorithm>
3 #include<cstring>
4 using namespace std;
5
6 int n,m,k,t;
7 int a[30001],s[30001]; //s[]储存输入的,a[]用来找爸爸!!
8
9 int getf(int u)
10 {
11 return u==a[u]? u:getf(a[u]);
12 }
13 void merge(int x,int y)
14 {
15 x=getf(x);
16 y=getf(y);
17 if(x!=y)
18 {
19 a[max(x,y)]=min(x,y); //x,y的大小要比较一下,,这里为了少打代码 直接写了
20 }
21 }
22 int main()
23 {
24 while(cin>>n>>m)
25 {
26 if(n==0&&m==0) break;
27 for(int i=0;i<n;i++)
28 a[i]=i; //初始化
29 memset(s,0,sizeof(s));
30 for(int i=0;i<m;i++)
31 {
32 cin>>t;
33 for(int i=0;i<t;i++)
34 cin>>s[i];
35 for(int i=1;i<t;i++)
36 merge(s[i-1],s[i]); //只要相邻两个人查一下关系, 任何一个人的身份都能确认
37 }
38 int cnt=1; //原来 0的人本身就是一个嫌疑人
39 for(int i=1;i<n;i++)
40 if(getf(i)==getf(0)) // 如果是和嫌疑人0有接触过的人
41 cnt++;
42 cout<<cnt<<endl;
43 }
44 }