并查集模板(算法)

并查集是由一个数组pre[],和两个函数构成的,一个函数为find()函数,用于寻找前导点的,第二个函数是combine()用于合并路线的

 1 int findx(int x)
 2 {
 3     int a;
 4     a=x;
 5     while(pre[a]!=a)///循环方法查找任意一个城市的前导点
 6     {
 7         a=pre[a];
 8     }
 9     /*if(pre[x]!=x)///递归方法查找任意一个城市的前导点
10     {
11         pre[x]=findx(pre[x]);
12     }*/
13     int i=x,j;
14     while(i!=a)
15     {
16         j=pre[i];///记录x的前导结点
17         pre[i]=r;///将i的前导结点设置为r的根节点.
18         i=j;
19     }
20     return a;
21 }

路径压缩为了加快查找的速度,将x点与其根节点直接相连,构造成类似于只有叶子结点而没有分支结点的树

 1 void combine(int x,int y)
 2 {
 3     int a,b;
 4     a=findx(x);///x的根节点为a
 5     b=findx(y);///y的根节点为b
 6     if(a!=b)///如果a,b不是相同的根节点,则说明ab不是连通的
 7     {
 8         pre[a]=b;///将a,b连接,将a的前导点设置为b
 9     }
10 }

初始化,我们将每一个结点的前导结点设置为自己,如果在combine函数时未能形成连通,将独立成点。

1 for(i=1; i<=n; i++)
2 {
3    pre[i]=i;///每一个城市的前导点都是自身
4 }

猜你喜欢

转载自www.cnblogs.com/wkfvawl/p/9063836.html
今日推荐