L2-024. 部落

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <set>
#include <algorithm>

using namespace std;

int pre[10005];
int cnt[10005];
int find(int x){
  if(pre[x] == x){
    return x;
  }
  else{
    return pre[x] = find(pre[x]);
  }
}
void join(int x,int y){
  int fx = find(x);
  int fy = find(y);
  if(fx != fy){
    pre[fy] = fx;
  }
}
int main(void){
  int n;
  cin>>n;
  for(int i = 1; i <= 10004; i++){
    pre[i] = i;
    }

  for(int i = 1; i <= n; i++){
    int num;
    cin>>num;
    int sl;
    cin>>sl;
    cnt[sl] = 1;
    for(int j = 1; j < num; j++){
      int id;
      cin>>id;
      join(sl,id);
      cnt[id] = 1;
    }
  }
  int t = 0;
  for(int i = 1; i <= 10000; i++){
    if(cnt[i]){
      t++;
    }
  }
  int total = 0;
  for(int i = 1; i <= t; i++){
    
    if(pre[i] == i){
      total++;
    }
  }
  printf("%d %d\n",t,total);
  int q;
  cin>>q;
  while(q--){
    int a,b;
    cin>>a>>b;
      if(find(a) == find(b)){
        printf("Y\n");
    }
    else{
      printf("N\n");
    }
  }
  return 0;
}

猜你喜欢

转载自blog.csdn.net/gyh0730/article/details/80246091