初始化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