并查集模版

来源:互联网 发布:女生做软件测试前景 编辑:程序博客网 时间:2024/05/06 12:12
#include<stdio.h>
#define  M 10000+10 
int pr[M]; // 父类的数组 
int rank[M]; //深度 
void init()// 数据的初始化 
{
for(int i=0;i<M;i++)
{
pr[i]=i;
rank[i]=1;
}
}
int find(int x)// 查找 
{
int r=x;  // 一般的情况就这么写。  
while(r!=pr[r])
r=pr[r];
//路径压缩  手动模拟压缩  时间上也不受数量的影响 
int i=x;int j;   //  也是可以用 递归  return x==pr[x]?x:find(pr[x]);  
while(i!=r) //这个递归也包含了路径压缩。但是对于 数量大 会很费时间 
{
j=pr[i];
pr[i]=r;
i=j;
}
return r;  // 返回根节点 
}
void join (int x,int y)  // 连通 
{
int fx=find(x);
int fy=find(y); //  这里也有一种优化 启发式合并
if(fx!=fy)  //只有两个的根节点不同 才需要连通 
{
if(rank[fx]>=rank[fy])    // 总是 将短的 附属到长的上 
{
pr[fy]=fx;
rank[fx]=rank[fx]+rank[fy];
}
else
{
pr[fx]=fy;
rank[fy]=rank[fy]+rank[fx]; 

}
 } 
int main()
{

return 0;
 } 
0 0
原创粉丝点击