首页 > 代码库 > HDU - 1213 How Many Tables
HDU - 1213 How Many Tables
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1213
典型的并查集,属于水题吧,但学会了路径压缩。
1 /*非递归,非路径压缩*/ 2 #include<stdio.h> 3 const int maxn=1000+5; 4 int fa[maxn]; 5 void init(int n) 6 { 7 for(int i=1;i<=n;i++) 8 fa[i]=0; 9 }10 int find_father(int x)11 {12 while(fa[x]!=0){13 x=fa[x];14 }15 return x;16 }17 void union_father(int x,int y)18 {19 int find_a=find_father(x),find_b=find_father(y);20 if(find_a!=find_b)21 fa[find_b]=find_a;22 }23 int main()24 {25 int t;26 scanf("%d",&t);27 while(t--){28 int n,m,a,b;29 scanf("%d%d",&n,&m);30 init(n);31 for(int i=1;i<=m;i++){32 scanf("%d%d",&a,&b);33 union_father(a,b);34 }35 int ans=0;36 for(int i=1;i<=n;i++)37 if(fa[i]==0)38 ans++;39 printf("%d\n",ans);40 }41 return 0;42 }
1 /*递归,路径压缩*/ 2 #include<stdio.h> 3 const int maxn=1000+5; 4 int fa[maxn]; 5 void init(int n) 6 { 7 for(int i=1;i<=n;i++) 8 fa[i]=0; 9 }10 int find_father(int x)11 {12 if(fa[x]==0)13 return x;14 fa[x]=find_father(fa[x]);15 return fa[x];16 }17 void union_father(int x,int y)18 {19 int find_a=find_father(x),find_b=find_father(y);20 if(find_a!=find_b)21 fa[find_b]=find_a;22 }23 int main()24 {25 int t;26 scanf("%d",&t);27 while(t--){28 int n,m,a,b;29 scanf("%d%d",&n,&m);30 init(n);31 for(int i=1;i<=m;i++){32 scanf("%d%d",&a,&b);33 union_father(a,b);34 }35 int ans=0;36 for(int i=1;i<=n;i++)37 if(fa[i]==0)38 ans++;39 printf("%d\n",ans);40 }41 return 0;42 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。