并查集这个很有意思,并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。昨天看书看到了,然后用C++简单实现了下。在Dijkstra算法中,用来判断两个顶点是否在同一个集合里。
里面定义了两个类,都是并查集,一个是QuickFind,查找很快,一个是QuickUnion,合并较快。写了一些注释,有一些优化的提示.看代码吧,有什么问题指出来吧。
QuickFind的实现
#include “QuickFind.h”
QuickFind::QuickFind(int N)
{
size=N;
id=new int[N];
for(int i=0;i
id[i]=i;
}
}
bool QuickFind::Find(int p,int q)
{
return id[p]==id[q];
}
void QuickFind::Unite(int p,int q)
{
int pid=id[p];
for(int i=0;i
id[i]=id[q];
}
QuickFind::~QuickFind(void)
{
delete []id;
}
QuickUnion的实现
#include “QuickUnion.h”
QuickUnion::QuickUnion(int N)
{
size=N;
id=new int[N];
for(int i=0;i
id[i]=i;
}
}
int QuickUnion::root(int i)
{
while (i!=id[i])
{
//id[i]=id[id[i]]; 若添加这句话则为压缩路径
i=id[i];
}
return i;
}
bool QuickUnion::Find(int p,int q)
{
return root(p)==root(q);
}
void QuickUnion::Unite(int p,int q)
{
//将p的根挂在q的根上,
//这样会导此数变高,若需要优化,需要设置另一个
//数组sz[],sz[i]表示所以根为i的节点的数目,然后将
//小树靠在大树上
/*
int i=root(p);
int j=root(q);
if(sz[i]<sz[j])
{
id[i]=j;sz[j]+=sz[i];
}
else
{
id[j]=i;sz[i]+=sz[j];
}*/
int rootp=root(p);
int rootq=root(q);
id[rootp]=rootq;
}
QuickUnion::~QuickUnion(void)
{
delete []id;
}
电神魔傀2街机免费版 官方版v1.2.1
下载三国战纪2手游腾讯渠道服 安卓版v2.41.0.0
下载三国战纪2手游抖音渠道服 安卓版v2.41.0.0
下载三国战纪2折扣服 安卓版v2.41.0.0
下载叫我大掌柜小米版 安卓版v7.4.4
叫我大掌柜小米版是这款模拟经营类手游的渠道服版本,在此版本中
cooking fever正版 安卓最新版v23.0.2
cooking fever正版是一款非常好玩的模拟经营类手游
咖啡厅的生活故事 最新版v1.7
咖啡厅的生活故事是一款模拟经营游戏,玩家们在游戏中可以经营一
迅猛龙模拟器金币不减反增版 v1.1.8
迅猛龙模拟器无限金币版是一款动物模拟类游戏,玩家们将在游戏中
泽塔奥特曼升华器免广告版 v1.4
泽塔奥特曼升华器去广告版是游戏的破解版本,在该版本中为玩家去