【codevs1073/P1551】家族/亲戚——并查集
这道题就是并查集的基础题,getf函数寻找该节点的祖先,要注意在查找的时候可以顺便把路上的节点的父节点也改为当前祖先(即路径压缩)。
询问的时候不能因为两个点的父节点不同就说他们不是同一棵树上的,要一直找到他们的祖先再做比较。
具体实现细节看代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }