其他分享
首页 > 其他分享> > 图论之并查集

图论之并查集

作者:互联网

最近刚刚学习完并查集,有感而发。

这篇仅仅是讲述基础的并查集,不带权值之类的东西。

首先是“查”的操作find()函数

int find(int x)
{
    if(fa[x]==x)
    {
        return fa[x]=x;
     }
    else return fa[x]=find(fa[x]);
}

其中,fa便是表示祖先。

使用递归算法(不用递归也可以用一个while()循环),直到找到祖先。

然后是"并"

void U(int x,int y)
{
    int rx=find(x);
    int ry=find(y);
    if(rx!=ry)
    {
        fa[ry]=rx;//合并
    }
}

rx与ry表示的分别是x与y的祖先,当他们两个祖先不同时,合并。

我的合并操作已经写进去了判断祖先是否相等。

自己写的模板题代码

#include<bits/stdc++.h>
using namespace std;
int fa[10000];
int n,m,z;
int find(int x)
{
    if(fa[x]==x)
    {
        return fa[x]=x;
    }
    else return fa[x]=find(fa[x]);
}
void U(int x,int y)
{
    int rx=find(x);
    int ry=find(y);
    if(rx!=ry)
    {
        fa[ry]=rx;
    }
}
int main()
{
    cin>>n>>m;
    int a,b;
    for(int i=1;i<=n;i++)
    {
        fa[i]=i;
    }
    for(int i=1;i<=m;i++)
    {
        cin>>z>>a>>b;
        if(z==2)
        {
            if(find(a)==find(b))
            {
                cout<<"Y\n";
            }
            else cout<<"N\n";
        }
        else if(z==1)
        {
            U(a,b);
        }
    }
    return 0;
}

 个人练习题目(洛谷):

P3367

P1551

P1111

P2078

P2256

P2814

P2024

标签:图论,return,int,查集,rx,ry,fa,find
来源: https://www.cnblogs.com/SoN3ri/p/16252062.html