当前位置: 代码迷 >> 综合 >> 1118 Birds in Forest (25分) / 并查集
  详细解决方案

1118 Birds in Forest (25分) / 并查集

热度:76   发布时间:2024-01-27 05:24:17.0

题目描述

在这里插入图片描述
在这里插入图片描述

AC代码

#include<bits/stdc++.h>
using namespace std;
int father[10005];
int find(int x){while(father[x]>=0){x=father[x];}return x;
}
void Union(int a,int b){int fa=find(a),fb=find(b);if(fa!=fb){					//按秩归并 if(father[fa]<father[fb]){father[fa]+=father[fb];father[fb]=fa;}else{father[fb]+=father[fa];father[fa]=fb;}}
}
int main() {memset(father,-1,sizeof(father)); //注意初始化 int n,maxnum=0;cin>>n;while(n--){int k,root,temp;cin>>k;for(int i=0;i<k;i++){scanf("%d",&temp);maxnum=max(maxnum,temp);  //更新birds id的最大值 if(i==0) root=temp;  //将每张图片的第一只bird作为根结点 else Union(temp,root);}}int cnt=0,num=0;for(int i=1;i<=maxnum;i++){if(father[i]<0) {cnt++;       //集合个数 num-=father[i];    //number of birds}}printf("%d %d\n",cnt,num);int k;cin>>k;while(k--){int a,b;scanf("%d%d",&a,&b);printf("%s\n",find(a)==find(b)?"Yes":"No");}return 0;
}
  相关解决方案