POJ 1611---The Suspects(并查集)

Posted lilibuxiangtle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1611---The Suspects(并查集)相关的知识,希望对你有一定的参考价值。

题意:0疑似有传染病,和0在一起的都疑似被传染(这些人也会传染别人),求有多少个人可能有传染病;

直接代码+注释(16ms)

 方法1:

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 using namespace std;
 5 
 6 const int maxn=20000000;
 7 int par[maxn],m,n;
 8 
 9 int find(int x)
10 
11     if(x!=par[x])
12         par[x]=find(par[x]);
13     return par[x];
14 
15 
16 void unionn(int a,int b)
17 
18     int fa=find(a);
19     int fb=find(b);
20     if(par[fb]!=fb) par[fa]=fb;     //如果fb不是头 fa并入fb即头为fb
21     else par[fb]=fa;                //如果fb是头 fb并入fa
22 
23 
24 int main()
25 
26     while(scanf("%d%d",&n,&m)&&(m||n))
27         int p,a,b;
28         for(int i=0;i<=n;i++)
29             par[i]=i;                //每个人的头为自己
30         
31         while(m--)
32             scanf("%d",&p);
33             p--;
34             scanf("%d",&a);
35             for(int i=0;i<p;i++)
36                 scanf("%d",&b);
37                 unionn(a,b);          //a后边的所有元素都并入a即a为头
38             
39         
40         int sum=0;
41         for(int i=0;i<n;i++)
42             while (par[i]!=i&&par[i]!=par[par[i]])      //如果i不是头并且i的上一级也不是头 找i的头 par[i]=头
43                 par[i]=par[par[i]];
44         
45         for(int i=0;i<n;i++)
46             if(par[i]==par[0]) sum++;               //谁和0是同一个头 说明被传染
47         
48         printf("%d\n",sum);
49     
50     return 0;
51 

 方法二:(方法二和方法一意思差不多,就是更简洁了一些)

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 using namespace std;
 5 
 6 const int maxn=300100;
 7 int par[maxn],m,n;
 8 
 9 int find(int x)
10 
11     if(x!=par[x])
12         par[x]=find(par[x]);
13     return par[x];
14 
15 
16 void unionn(int a,int b)
17 
18     int fa=find(a);
19     int fb=find(b);
20     if(fa==fb) return;
21     else par[fb]=fa;
22 
23 
24 int main()
25 
26     while(scanf("%d%d",&n,&m)&&(m||n))
27         int p,a,b;
28         for(int i=0;i<=n;i++)
29             par[i]=i;
30         
31         while(m--)
32             scanf("%d",&p);
33             p--;
34             scanf("%d",&a);
35             for(int i=0;i<p;i++)
36                 scanf("%d",&b);
37                 unionn(a,b);
38             
39         
40         int sum=0;
41         for(int i=0;i<n;i++)
42             if(find(i)==find(0)) sum++;
43         
44         printf("%d\n",sum);
45     
46     return 0;
47 

 

以上是关于POJ 1611---The Suspects(并查集)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1611 The Suspects

POJ-1611 The Suspects( 并查集 )

POJ--1611 The Suspects

poj 1611 The Suspects 并查集

poj-1611-The Suspects

POJ1611 The Suspects