<span>POJ 1611---The Suspects(并查集)</span>

题意: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 }

 

全部评论

相关推荐

01-17 18:15
已编辑
门头沟学院 前端工程师
从上午约我面试然后他迟到,然后中午发消息打电话给我说重约面试时间,我就该意识到。【管理不规范,只是这家公司最小的问题】他妈一个不是技术的人来给我技术面。。。连vvue什么?连react是什么?连普通的HTTP请求是什么?这些东西都不懂的人来给我做技术面,我真的。。。。他妈浪费我40分钟。。一天面了三场,这家公司属实牛逼。不停的问我说上班下班时间谁来派任务公司在哪个区发展怎么样,公司的管理模式什么样,培养机制怎么样带教负责什么。如果出bug了谁来负责。我真的求你了别闹了。我答了15分钟,我已经很不想回答了。然后他就问了我一些很招笑的面试问题。问我前端框架架构设计怎么设计,Websocket可以实现SSE吗??最后还要我硬说,为什么我们公司没转正?为什么?为什么?我说我怎么知道。。这是领导决定,又不是我决定,他说让我分析一下。。。我真的草了,这个人是来搞我的吗?我最后问我说这个没有技术面,他说他就是技术面虽然我今天面的另外两家也很逆天。一个人不停的吹牛,自己100人的公司是全国前几,吹牛了一个小时。我中途几次想跑,真的是底下玩手机在听他那吹牛。。然后最后来了句说,我承诺的东西要实现哦,不然的话,公司会追责的,我我请问我承诺了什么?从头到尾也没有说让我承诺什么。而且我只是作为一个小小的前端卡拉咪,应届生。我要承担什么??好崩溃。。好崩溃的,一天面了三场。两家1000-9999的公司。面试官问的都很傻逼,甚至有些东西我问他估计都答不出来。。&nbsp;我这是在干嘛呀?浪费我一天的时间,我的奶奶。。我本来是抱着说我很菜,我要面试中发现自己的问题,现在来看他妈的这三场面试,面试本身就是问题。。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务