您的位置:首页 > 其它

并查集--模板

2018-02-06 22:25 190 查看
初始化pre数组,即父节点。

void init(){

for(int i=1;i<=MAX;i++)//n表示输入的结点的个数
{
pre[i]=i;//将每一个结点的前导点设置为自己

}

}带参数的初始化。
void init(int n){

for(int i=1;i<=n;i++)//n表示输入的结点的个数
{
pre[i]=i;//将每一个结点的前导点设置为自己

}

}find函数,查找根节点,这里还加了路径压缩。
int find(int x)
{
int r=x;
while(pre[r]!=r)
r=pre[r];//找到他的前导结点
int i=x,j;
while(i!=r)//路径压缩算法
{
j=pre[i];//记录x的前导结点
pre[i]=r;//将i的前导结点设置为r根节点
i=j;
}
return r;
}join函数,合并两个集合,具体谁当父亲谁当儿子要看题意。
void join(int x,int y)
{
int a=find(x);//x的根节点为a
int b=find(y);//y的根节点为b
if(a!=b)//如果a,b不是相同的根节点,则说明ab不是连通的
{
pre[a]=b;//我们将ab相连 将a的前导结点设置为b
//!!!!!!!!!!根据题意这里是 pre[a] = b 还是 pre[b] = a !!!!!!!!!!
}
else return;
}这是一个比较有趣的并查集详解 click here
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: