The Suspects 并查集

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 }

猜你喜欢

转载自www.cnblogs.com/thunder-110/p/9021278.html