并查集的原理
最初做并查集是杭电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函数使合并:
- int find(int x) //查找
- { //查找根结点
- while(father[x]!=x)
- x=father[x];
- return x;
- }
- void join(int a,int b) //合并
- { //判断a,b是否已经连通,若连通就不用管理
- //若不连通,就将a,b所在的连通分支连接起来
- int tmpa=find(a);
- int tmpb=find(b);
- if(tmpa!=tmpb)
- father[tmpa]=tmpb;
- }