1. 程式人生 > >【codevs1073/P1551】家族/親戚——並查集

【codevs1073/P1551】家族/親戚——並查集

sin name 分享 char 找到 play www. i++ pan

題目鏈接:codevs,洛谷


這道題就是並查集的基礎題,getf函數尋找該節點的祖先,要註意在查找的時候可以順便把路上的節點的父節點也改為當前祖先(即路徑壓縮)。

詢問的時候不能因為兩個點的父節點不同就說他們不是同一棵樹上的,要一直找到他們的祖先再做比較。

具體實現細節看代碼:

技術分享
#include<cstdio>
#include<cstring>
using namespace std;
int f[5005];
int read()
{
    int ans=0,f=1;char c=getchar();
    while(c<0||c>
9){if(c==-)f=-1;c=getchar();} while(c>=0&&c<=9){ans=ans*10+c-48;c=getchar();} return ans*f; } int getf(int x) { if(f[x]==x)return x; f[x]=getf(f[x]); return f[x]; } void fa(int x,int y) { int x0=getf(x),y0=getf(y); if(x0==y0)return ; f[y0]=x0; } int main() {
int n=read(),m=read(),p=read(),ai,bi; for(int i=1;i<=n;i++)f[i]=i; for(int i=1;i<=m;i++){ ai=read();bi=read(); fa(ai,bi); } for(int i=1;i<=p;i++) { ai=read();bi=read(); int x0=getf(ai),y0=getf(bi); if(x0==y0)printf("Yes\n"); else
printf("No\n"); } return 0; }
code1073/洛谷P1551

【codevs1073/P1551】家族/親戚——並查集