概述
题意: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("%dn",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("%dn",sum); 45 } 46 return 0; 47 }
转载于:https://www.cnblogs.com/lilibuxiangtle/p/11330481.html
最后
以上就是威武小丸子为你收集整理的POJ 1611---The Suspects(并查集)的全部内容,希望文章能够帮你解决POJ 1611---The Suspects(并查集)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复