欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

并查集总结

程序员文章站 2022-03-24 17:27:02
...

目录

一、并查集

二、带权并查集


一、并查集

每当学习一个新算法,真的不得不感叹算法真的……博大精深!!

先分享一篇大佬的博客晚上再来补文,讲的太有意思了,一看就能明白,要是每个算法都有人这么有趣生动地给我讲就好了。

https://blog.csdn.net/u013546077/article/details/64509038

简单来说并查集就是用来判断连通性滴,核心代码如下。

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

 

int pre[1000];
int find(int x)//查找根节点
{
	int r=x;
	while(pre[r]!=r)
		r=pre[r];
	int i=x,j;
	
	while(i!=r){ //路径压缩,这个有时候可以不用吧,不过也不难理解 
		j=pre[i]; //在改变上级前用临时变量j记录下他的值
		pre[i]=r;//把上级改为根节点
		i=j; 
	}
	
	return r; //返回根节点 
 } 
 void join(int x,int y) //判断x,y是否连通,如果已经连通就不用管了。不连通就把他们的连通分支合并起来 
 {
 	int fx=find(x),fy=find(y);
 	if(fx!=fy)
 		pre[fx]=fy;
 }

 

【题目】

【HDU1232】通畅工程

【HDU1272】小希的迷宫(判断无向图是否有回路)

 

二、带权并查集

  • 定义:带权并查集即是结点存有权值信息的并查集。
  • 适用:当两个元素之间的关系可以量化,并且关系可以合并时,可以使用带权并查集来维护元素之间的关系。
  • 权值:带权并查集每个元素的权通常描述其与并查集中祖先的关系,这种关系如何合并,路径压缩时就如何压缩。
  • 与并查集的区别:带权并查集可以推算集合内点的关系,而一般并查集只能判断属于某个集合。

带权值的并查集只不过是在并查集中加入了一个value[ ]数组,value[ ]可以记录很多种东西,不一定是类似距离这种东西,也可以是相对于根节点的状态,加入了权值,函数应该有一些改变。

int findroot(int x)
{
    if(x!=pre[x])
    {
        int t=pre[x];
        pre[x]=findroot(pre[x]);//路径压缩
        value[x]+=value[t];//该点到根的距离
    }
    return pre[x];
}