并查集模板
2012-04-13 13:55
190 查看
貌似这么短的代码也不需要什么模板。。但还是写出来装下逼吧。。
带路径压缩的查找算法,需要对p[i]初始化为i,1<=i<=n,n是集合元素个数
按秩合并算法,需要对rank[i]初始化为0,1<=i<=n,n是集合元素个数,还要注意,该函数的使用前提是ra!=rb
初始化
void init(int n){
int i;
for(i=1;i<=n;i++)//默认编号是1到n,n是集合元素个数
p[i]=i,rank[i]=0;
}
带路径压缩的查找算法,需要对p[i]初始化为i,1<=i<=n,n是集合元素个数
int find(int x){ int r,t,i; r=x; while(r!=p[r]) r=p[r]; i=x; while(i!=r){ t=p[i]; p[i]=r; i=t; } return r; }
按秩合并算法,需要对rank[i]初始化为0,1<=i<=n,n是集合元素个数,还要注意,该函数的使用前提是ra!=rb
void merge(int ra,int rb){ if(rank[ra]==rank[rb]){ p[rb]=ra; rank[ra]++; }else{ if(rank[ra]>rank[rb]) p[rb]=ra; else p[ra]=rb; } }
初始化
void init(int n){
int i;
for(i=1;i<=n;i++)//默认编号是1到n,n是集合元素个数
p[i]=i,rank[i]=0;
}