1. 程式人生 > 其它 >圖論之並查集

圖論之並查集

最近剛剛學習完並查集,有感而發。

這篇僅僅是講述基礎的並查集,不帶權值之類的東西。

首先是“查”的操作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