L2-024部落(并查集)

    科技2026-06-04  10

    部落

    #include <iostream> #include<cstdio> #include<cstring> #include<set> using namespace std; #define INF 0x3f3f3f3f; const int N=10010; int par[N]; int ranks[N]; int peo[N]; int inde[N]; int num; void init() { for(int i=1;i<=N;i++) {par[i]=i;ranks[i]=0;} } int find(int x) { if(par[x]==x)return x; else return par[x]=find(par[x]); } int same(int x,int y) { return find(x)==find(y); } void unit(int x,int y) { x=find(x); y=find(y); if(find(x)==find(y))return; if(ranks[x]<ranks[y]) par[x]=y; else { par[y]=x; if(ranks[x]==ranks[y]) ranks[x]++; } } int main() { int n; scanf("%d",&n); int m=n; init(); memset(inde,-1,sizeof inde); while(m--) { int k; scanf("%d",&k); for(int i=1;i<=k;i++) scanf("%d",&peo[i]),inde[peo[i]]++; for(int i=1;i<k;i++) unit(peo[i],peo[i+1]); } for(int i=1;i<N;i++) if(inde[i]!=-1)num++; set<int> s; for(int i=1;i<=num;i++) { s.insert(find(i)); } printf("%d %d\n",num,s.size()); int Q; scanf("%d",&Q); while(Q--) { int x,y; scanf("%d%d",&x,&y); if(same(x,y)) printf("Y\n"); else printf("N\n"); } return 0; }
    Processed: 0.012, SQL: 9