hdu 1232

来源:互联网 发布:免root长截屏软件 编辑:程序博客网 时间:2024/05/20 10:23

并查集问题:

(2,4) {2,4}
(5,7) {2,4} {5,7}
(1,3) {1,3} {2,4} {5,7}
(8,9) {1,3} {2,4} {5,7} {8,9}
(1,2) {1,2,3,4} {5,7} {8,9}
(5,6) {1,2,3,4} {5,6,7} {8,9}
(2,3) {1,2,3,4} {5,6,7} {8,9}
father[x]为x的父亲,即一个集合的最久远的祖先

1.查找某个元素的

int find(int x){while(father[x]!=x){//father[x]=find(father[x]);x=father[x];}return father[x];}

 

2.合并两个集合

即将其中一个的最久远的祖先指向另一个最久远的祖先

3.判断两个元素是否在一个集合里

即两个元素的最久远的祖先是否为同一个

代码:

#include <stdio.h>int father[1005];int n,m,a,b;int find(int x){while(father[x]!=x){//father[x]=find(father[x]);x=father[x];}return father[x];}int main(){int i,j;while(scanf("%d %d",&n,&m)==2 && n){for(i=1;i<=n;i++)father[i]=i;for(i=1;i<=m;i++){scanf("%d %d",&a,&b);a=find(a);b=find(b);father[a]=b;}j=0;for(i=1;i<=n;i++){if(father[i]==i)j++;}printf("%d\n",j-1);}return 0;}


 

原创粉丝点击