关闭

并查集模板代码

472人阅读 评论(0) 收藏 举报
分类:

  以下是我一直使用的并查集模板。

  

int p[MAX];  // 存储父结点
int num[MAX];  // 存储当前集合元素个数


  初始化

  num的初始值由具体题目决定,比如对不具有自反性的关系num初始化为0,如果编号为1~n,要修改循环变量

for(i=0;i<n;i++){
    num[i]=1;
    p[i]=i;
}


  find函数的递归实现

  代码只有一行,但是数据大易超时。

int find(int x){
	return x==p[x]?x:find(p[x]);
} 

  find函数的非递归实现

int find(int x)
{
    int k, j, r;
    r=x;
    while(r!=p[r])   
        r=p[r];     
    k=x;        
    while(k!= r)             
    {
        j=p[k];       
        p[k]=r;     
        k=j;                 
    }
    return r;                 
}

  

  Union函数:利用路径压缩合并两个集合

  经典方法1:将小的集合合并到大的集合,只更新大集合的元素个数

void Union(int x,int y)
{
	int px=find(x);
	int py=find(y);
	if(px==py)return;
	if(num[px]>num[py]){
		num[px]+=num[py];
		p[py]=px;
	}
	else{
		num[py]+=num[px];
		p[px]=py;
	}
}

  经典方法2:任意将一个集合合并到另一个集合,但同时更新两个集合元素个数

void Union(int x,int y)
{
	int px=find(x);
	int py=find(y);
	if(px!=py)
	{
		num[px]+=num[py];
		num[py]=num[px];
		p[px]=py;
	}
}

  经典方法3:不需要记录集合大小时,任意将一个集合合并到另一个集合

void Union(int x,int y)
{
	int px=find(x);
	int py=find(y);
	if(px!=py)p[px]=py;
}

  计算集合个数

setnum=0;
for(i=0;i<n;i++){
	if(p[i]==i)setnum++;
}

  当前元素所在集合的元素个数

num[find(x)]



0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

【模版】并查集 及路径压缩

Ps:在网上看到的写的很好的并查集
  • u013486414
  • u013486414
  • 2014-08-19 15:10
  • 5628

python 实现并查集源代码

问题描述: 这是典型的并查集的应用,并查集的概念详见:http://www.doc88.com/p-375363060663.html #coding:utf-8 #py2.7...
  • rav009
  • rav009
  • 2013-10-16 18:55
  • 3190

SDUT2797_电影节(并查集)(模板)

电影节 Time Limit: 1000MS Memory limit: 65536K 题目描述 某届电影节评选电影,共有两部电影进入最后评选环节,有n名观众,每个人有一次投票的机会,每个...
  • u013320038
  • u013320038
  • 2014-02-20 13:28
  • 1197

kruskal_并查集_代码模板 &hdu1232

kruskal代码模板 input a _the number of verteices b _the number of edges v1_verteices wi_the weight ...
  • shichuanwang
  • shichuanwang
  • 2012-12-05 21:04
  • 124

数据结构------并查集模板--C++

  • 2014-07-10 15:50
  • 399B
  • 下载

并查集代码

  • 2015-12-12 20:18
  • 1KB
  • 下载

并查集原理及代码实现

  • 2015-08-14 07:12
  • 28KB
  • 下载

HDU 1213 How Many Tables(并查集入门模板题)

C - How Many Tables HDU - 1213 Today is Ignatius' birthday. He invites a lot of friends. Now it's d...
  • qq_41444888
  • qq_41444888
  • 2018-01-03 12:31
  • 302

SDUT 电影节(并查集模板)

电影节 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 某届电影节评选电影,共有两部电影...
  • qq_16255321
  • qq_16255321
  • 2014-08-14 19:47
  • 463

计蒜客 接龙 (带权并查集模板题)

题目链接:https://www.jisuanke.com/course/615/28116 题目大意:通过一系列的合并操作,然后求解出两点之间的距离。 题目思路:我们可以很容易的统计俩张卡片是否...
  • qq_29980371
  • qq_29980371
  • 2017-08-09 09:38
  • 135
    个人资料
    • 访问:314250次
    • 积分:4977
    • 等级:
    • 排名:第6610名
    • 原创:175篇
    • 转载:0篇
    • 译文:14篇
    • 评论:131条
    最新评论