并查集

来源:互联网 发布:音乐播放设备 知乎 编辑:程序博客网 时间:2024/06/09 15:21
#include <iostream>using namespace std;int parent[100];//构造一个初始并查集,s是集合元素的个数,此时初始化了s个集合,每一个集合都只有一个元素//数组的范围为parent[0]~parent[s-1]//初始的时候,数组元素的值都是 -1,表示此时都是根结点。void ufset(int s){    int si=s;    for(int i=0;i<si;i++)    parent[i]=-1;}//查找元素x所在集合//从x开始,沿父指针链一直向上,直到向上,直到达到一个父指针域为负值的结点位置int Find(int x) //迭代查找方式{    while(parent[x]>=0) x=parent[x];    return x;}/*int find_1(int x)  //递归查找方式{    if(parent[x]<0) return x;  //x是根时,直接返回x    else return find_1(parent[x]);  //否则,递归找x的父的根}*///折叠规则压缩路径法//包含元素i的树中搜索根,并将从元素i到根的路径上的所有结点都变成根的结点int collapsingfind(int i){    int j;    for(j=i;parent[j]>=0;j=parent[j]); //搜索j的根    while(i!=j)   //向上逐次压缩    {        int temp=parent[i];        parent[i]=j;        i=temp;    }    return j;  //返回根}//集合的合并//让root2的父指针指向root1即可实现两个集合的合并void Union(int root2,int root1){    parent[root1]+=parent[root2];    parent[root2]=root1;}//使用加权规则得到改进的Union操作void WeightUnion(int root2,int root1){    int r2=Find(root2);  //r2和r1是root2和root1的父结点    int r1=Find(root1);    int temp;    if(r1!=r2)    {        temp=parent[r1]+parent[r2];        if(parent[r1]<parent[r2]){parent[r1]=temp;parent[r2]=r1;}  //以r2根的树结点多        else {parent[r1]=r2;parent[r2]=temp;}    }}int main(){    ufset(10);  //初始化10个元素    Union(6,0);    Union(7,0);    Union(8,0);    Union(4,1);    Union(9,1);    Union(3,2);    Union(5,2);    for(int i=0;i<10;i++) cout<<parent[i]<<" ";    return 0;}

0 0
原创粉丝点击