圖論之並查集
阿新 • • 發佈:2022-05-10
最近剛剛學習完並查集,有感而發。
這篇僅僅是講述基礎的並查集,不帶權值之類的東西。
首先是“查”的操作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;
}
個人練習題目(洛谷):