洛谷P1551亲戚 并查集 按秩合并 + 路径压缩
#include <bits/stdc++.h> using namespace std ; const int N = 5011 ; int fa[N],rk[N] ; int n,m,Q ; inline void init() { for(int i=1;i<=n;i++) fa[ i ] = i,rk[ i ] = 1 ; } inline int find(int x) { if(x==fa[ x ]) return x ; return fa[ x ] = find(fa[ x ]) ; } inline void Union(int x,int y) { x = find(x) ; y = find(y) ; if(x==y) return ; if(rk[ x ] < rk[ y ]) // 并查集 按秩合并 fa[ x ] = y ; // 按照深度大小合并,实际上也是按照子树大小合并 else { fa[ y ] = x ; if(rk[ x ]==rk[ y ]) rk[ x ]++ ; } } int main() { scanf("%d%d%d",&n,&m,&Q) ; init() ; int x,y ; for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y) ; Union(x,y) ; } for(int i=1;i<=Q;i++) { scanf("%d%d",&x,&y) ; if(find( x )==find( y )) printf("Yes\n") ; else printf("No\n") ; } return 0 ; }
时间: 2024-10-29 05:12:06