题目粗心
当初有N张图片,每一张图片外面有K只鸟,在同一张图片中的鸟属于同一棵树,计算森林中树木的最大数目,并且对于任意一对鸟,判断是否在同一棵树上。
算法思路
本题考查并查集的利用,咱们应用set汇合birds保留所有的输出的鸟,并在输出每一张图片的时候,将其中所有的鸟进行合并为一组,而后对于birds中所有的鸟类依据其先人归并为一棵树,并存放到set汇合trees中,最初对于任意两个鸟的编号,只须要比拟father数组的值是否雷同即可。
留神点
- 1、查找father的办法得应用门路压缩,不然会有一个测试点超时。
提交后果
AC代码
#include<cstdio>#include<algorithm>#include<unordered_set>#include<vector>using namespace std;unordered_set<int> birds;unordered_set<int> trees;int father[10005];int findFather(int x){ int a = x; while(x!=father[x]){ x = father[x]; } while (a!=father[a]){ int z = father[a]; father[a] = x; a = z; } return x;}void Union(int a,int b){ int fa = findFather(a); int fb = findFather(b); if(fa!=fb){ father[fa] = fb; }}int main() { for(int i=0;i<=10000;++i){ father[i] = i; } int n; scanf("%d",&n); for(int i=0;i<n;++i){ int k; scanf("%d",&k); vector<int> t(k); for(int j=0;j<k;++j){ scanf("%d",&t[j]); birds.insert(t[j]); if(j!=0){ Union(t[j],t[j-1]); } } } for(auto it:birds){ int f=findFather(it); trees.insert(f); } printf("%lu %lu\n",trees.size(),birds.size()); int query; scanf("%d",&query); for(int i=0;i<query;++i){ int a,b; scanf("%d %d",&a,&b); if(father[a]==father[b]){ printf("Yes\n"); }else{ printf("No\n"); } } return 0;}