题意:同一张图中的bird在同一棵tree上,问一共有几棵tree,并判断任意两只bird是否在同一棵tree上。
#include <bits/stdc++.h>
using namespace std;
#define INF 0x7FFFFF
int fa[10005];
void Init()
{
for(int i=1;i<10005;i++)
fa[i]=i;
}
int Find(int x)
{
if(x==fa[x])
return fa[x];
else
return fa[x]=Find(fa[x]); //必须进行路径压缩,不然会超时
}
void Union(int x,int y)
{
int xx=Find(x);
int yy=Find(y);
if(xx!=yy)
fa[xx]=yy;
}
int main()
{
int n;
cin>>n;
set<int> s;
Init();
while(n--){
int k;
cin>>k;
int x;
cin>>x;
s.insert(x);
for(int i=1;i<k;i++){
int y;
cin>>y;
Union(x,y);
s.insert(y);
x=y;
}
}
int sum=0;//bird数量
sum=s.size()