并查集(不相交集合)

在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。有一个联合-查找算法union-find algorithm)定义了两个用于此数据结构的操作:

有如图所示

(1)将每个节点的祖宗设为自己:

(2)找到每个节点的最开始的祖宗

(3)进行路径压缩合并,将连在一起的,把左面作为右边的祖宗

以下是代码演示:

#include<bits/stdc++.h>
using namespace std;
int f[1005];
int pos[10005];
int n,m,sum=0;
void Init(int n)        //初始化函数,将每个节点将自己设为祖宗节点 
{
    for(int i=1;i<=n;i++)
    {
        f[i]=i;
    }
    return;
}
int ptr_get(int x)    //查询该节点的祖宗节点 
{
    if(f[x]==x)
    return x;
    else
    return ptr_get(f[x]);
}
void ptr_merge(int x,int y)  //将两个节点进行合并,以左边的节点作为祖宗(每次输入的时候) 
{
    int t1,t2;
    t1=ptr_get(x);
    t2=ptr_get(y);
    if(t1!=t2)
    {
        f[t2]=t1;
    }
    return;
}
int main()             //主函数 
{
     int i,x,y;
     int count=0;
     cin>>n>>m;
     Init(n);
     for(i=1;i<=n;i++)
     {
         cin>>x>>y;
         ptr_merge(x,y);
     }
     for(i=1;i<=m;i++)
      {
        if(f[i]==i)
        count++;
     }
     cout<<count<<endl;
}

题目链接:http://acm.jlnu.edu.cn/problem.php?id=1765

猜你喜欢

转载自www.cnblogs.com/julyzqy/p/11747129.html