【codevs1073/P1551】家族/親戚——並查集
阿新 • • 發佈:2017-08-03
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>‘code1073/洛谷P15519‘){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"); elseprintf("No\n"); } return 0; }
【codevs1073/P1551】家族/親戚——並查集