A1118
Description:
位于同一图片中的鸟为同一棵树,给出每张照片中鸟的编号,求总树的数目,并判断两只鸟是否位于同一棵树;
思路:
- 并查集,再次注意maxn 不是题目中的N<=1e4…
- 并查集的背诵模板及注解见另一篇博客A1107 Social Clusters
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 1e4+5;
int fa[maxn], birdcnt;
bool bird[maxn];
int get(int n){
if(n == fa[n]) return n;
return fa[n] = get(fa[n]);
}
void me(int u, int v){
u = get(u);
v = get(v);
if(u != v){
fa[v] = u;
}
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
int n, q, b, pre, k;
scanf("%d", &n);
for(int i = 1; i <= maxn; i++)
fa[i] = i;
memset(bird, false, sizeof(bird));
birdcnt = 0;
for(int i = 0; i < n; i++){
scanf("%d", &k);
for(int j = 0; j < k; j++){
scanf("%d", &b);
if(bird[b] == false){
bird[b] = true;
birdcnt++;
}
if(j != 0) me(pre, b);
pre = b;
}
}
set<int>ans;
for(int i = 1; i <= birdcnt; i++)
ans.insert(get(i));
printf("%d %d\n", ans.size(), birdcnt);
scanf("%d", &q);
int u, v;
for(int i = 0; i < q; i++){
scanf("%d%d", &u, &v);
if(get(u) == get(v)) printf("Yes\n");
else printf("No\n");
}
return 0;
}