并查集模板(算法)
Posted wkfvawl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集模板(算法)相关的知识,希望对你有一定的参考价值。
并查集是由一个数组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 }
以上是关于并查集模板(算法)的主要内容,如果未能解决你的问题,请参考以下文章