1118. Birds in Forest (25)
考察并查集
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> sets(10240);
int n,q,birdscnt,treecnt;
int find(int x)
{
return sets[x]==x?x:sets[x]=find(sets[x]);
}
int main()
{
cin>>n;
for(int i=0;i<=10000;++i) sets[i]=i;
for(int i=0;i<n;++i)
{
int m,h,x;
cin>>m>>h;
birdscnt=max(birdscnt,h);
for(int i=0;i<m-1;++i)
{
cin>>x;
birdscnt=max(birdscnt,x);
int l1=find(h),l2=find(x);
if(l1!=l2) sets[l2]=l1;
}
}
for(int i=1;i<=birdscnt;++i)
{
if(sets[i]==i)++treecnt;
}
cout<<treecnt<<" "<<birdscnt<<endl;
cin>>q;
while(q--)
{
int b1,b2;
cin>>b1>>b2;
find(b1)==find(b2)?cout<<"Yes\n":cout<<"No\n";
}
return 0;
}

本文介绍了一个使用并查集算法解决的问题:通过输入树木和鸟类的数据来确定森林中独立树木的数量及最高的鸟类编号。文章详细展示了如何利用并查集进行节点合并,并最终输出查询结果。
351

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



