谈谈并查集

                                                               并查集的原理

最初做并查集是杭电1232畅通工程

首先,在地图上给你几个城镇,告诉你哪些城镇之间是直接连通的,最后要解决整幅图的连通性问题。比如给你两个点,让你判断它们之间是否连通,或者是给你一幅图的几个连通分支树,也就是被分成了即个独立的块。像畅通工程这样,问还需要修几条路,实际上是求有几个连通分支。如果有一个连通分支,说明整幅图都连通了,就不用修路了;如果有两个连通分支,那么还需要修一条路,从两个连通分支中各选一个点,将他们连起来,那么所有的点都连起来了; 如果有三个连通分支,只需要修两条路.............

以下面这组数据输入数据来说明

4

2

1

3

4

3

以下面这组数据输入数据来说明

4

2

1

3

4

3

用下面这组数据来说明:

4 2

1 3

4 3

第一行告诉你,一共有4个点,两条路。下面两行告诉你,1,3之间有路,4,3之间有路。那么整幅图被分成了1-3-4  ,2 这两部分,只要再加一条路,将2和任意一个点连起来,那么整幅图就连起来了,畅通工程就实现了。那么这组数据输出1就可以了。

并查集由一个整数型的数组和两个函数构成。

数组

pre[]

记录了每个点的前导点是什么,

函数

find

是查找,

join

是合并

并查集有一个整型数组和两个函数构成的。数组father[]记录了每个点的前导点是什么,find函数使查找,join函数使合并:

  1. int find(int x)    //查找  
  2. {  //查找根结点
  3.     while(father[x]!=x)  
  4.         x=father[x];  
  5.   
  6.     return x;  
  7. }  
  8.   
  9. void join(int a,int b)   //合并  
  10. {  //判断a,b是否已经连通,若连通就不用管理
  11. //若不连通,就将a,b所在的连通分支连接起来
  12.     int tmpa=find(a);  
  13.     int tmpb=find(b);  
  14.   
  15.     if(tmpa!=tmpb)  
  16.         father[tmpa]=tmpb;  
  17. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值