并查集水题。。。
//
// main.cpp
// PATA1118
//
// Created by Phoenix on 2018/2/24.
// Copyright © 2018年 Phoenix. All rights reserved.
//
#include <iostream>
#include <cstdio>
const int maxn = 10010;
int father[maxn];
int exist[maxn] = {0};
int findFather(int x) {
int a = x;
while (a != father[a]) {
a = father[a];
}
while (x != father[x]) {
int c = father[x];
father[x] = a;
x = c;
}
return a;
}
void Union(int a, int b) {
int faA = findFather(a);
int faB = findFather(b);
if(faA != faB) father[faA] = faB;
}
int main(int argc, const char * argv[]) {
for(int i = 0; i < maxn; i++) {
father[i] = i;
}
int n, q;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
int k, a, b;
scanf("%d %d", &k, &a);
exist[a] = 1;
for(int j = 1; j < k; j++) {
scanf("%d", &b);
exist[b] = 1;
Union(a, b);
}
}
int num_tree = 0, num_bird = 0;
for(int i = 0; i < maxn; i++) {
if(exist[i] == 1) {
num_bird++;
if(father[i] == i) num_tree++;
}
}
printf("%d %d\n", num_tree, num_bird);
scanf("%d", &q);
for(int i = 0; i < q; i++) {
int a, b;
scanf("%d %d", &a, &b);
if(findFather(a) == findFather(b)) printf("Yes\n");
else printf("No\n");
}
return 0;
}

3309

被折叠的 条评论
为什么被折叠?



