题目翻译:
给n张照片,每张照片有k只鸟,假设这k只鸟在同一颗树上。问n张照片中最少有多少数,共有多少鸟。然后询问q次,问两个编号的鸟是否同一颗树。
题解思路:
用并查集或者dfs
代码:
并查集实现:
#include<bits/stdc++.h>
using namespace std;
int f[10010],c[10010];
vector<int> v[10010];
map<int, int> p;//统计小鸟个数
int N, Q;
int find(int i){
if (i != f[i]) f[i] = find(f[i]);
return f[i];
}
int main()
{
cin >> N;
for (int i = 0;i < N;i++)
{
int K; cin >> K;
while (K--)
{
int a; cin >> a;
v[i].push_back(a);
p[a] = 1;
}
}
for (int i = 0;i < p.size();i++)
f[i] = i;
for (int i = 0;i < N;i++)
for (int j = 1;j < v[i].size();j++)
{
int a = find(v[i][0]), b = find(v[i][j]);
if (a != b) f[b] = a;
}
int num = 0, sum = 0;
for (int i = 1;i <= p.size();i++)
c[find(i)]++;
sort(c, c + p.size(), greater<int>());
while (c[num])
{
sum += c[num];
num++;
}
cout << num << " " << sum << endl;
cin >> Q;
while (Q--)
{
int a, b;
cin >> a >> b;
if (find(a) != find(b))
cout << "No" << endl;
else
cout << "Yes" << endl;
}
}
坑点:
无
文章讲述了如何利用并查集数据结构解决给定照片中鸟的问题,包括计算最少树的数量和查询两只鸟是否来自同一棵树。给出的C++代码展示了如何统计和判断鸟的归属关系。
356

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



