一些科学家为森林中成千上万的鸟类拍照。
假设所有出现在同一张照片中的鸟都属于同一棵树。
请你帮助科学家计算森林中树木的最大数量,对于任何一对鸟类,请判断它们是否在同一棵树上。
思路:与1013几乎一样,在输入上做了一点改变,转化为求点的数量和连通块的数量,并询问两点是否在同一连通块。
考虑并查集来解决这种求连通块问题。
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f3f
using namespace std;
const int N=1e5+233;
int pre[N];
int n,m,k;
int id[N],vis[N];
int find(int x){return x==pre[x] ? x:pre[x]=find(pre[x]);}
void join(int a,int b,int &cnt){
if(find(a)!=find(b)){
pre[find(b)]=find(a);
cnt--;
}
}
int main()
{
cin>>n;
rep(i,0,N) pre[i]=i;
int sum=0,cnt=0;
rep(i,0,n){
cin>>k;
rep(j,0,k){
cin>>id[j];
if(!vis[id[j]]){
sum++,cnt+