并查集的应用,但是一上来有点蒙蔽,因为这次多了一个媒介,通过活动来判断人员是否在一个集合;有一个示例思路:构建活动的集合,首次发现在该活动的人员,将对应活动索引的内容设置为该人员编号;如果后面输入还有该活动,就将具有该活动的人员和数组内的人员进行并查集合并;大致代码如下所示:
#include#include #include using namespace std;const int N=1010;int course[N]={0};int father[N];int isRoot[N]={0};void init(int n){ for(int i=1;i<=n;i++){ father[i]=i; isRoot[i]=0; }}int findfather(int x){ int a=x; while(x!=father[x]){ x=father[x]; } //进行并查集路径的压缩 while(a!=father[a]){ int z=a; a=father[a]; father[z]=x; } return x;}void Union(int a,int b){ int faA=findfather(a); int faB=findfather(b); if(faA!=faB) father[faA]=faB;}bool cmp(int a,int b){ return a>b;}int n,h;int main(){ scanf("%d",&n); init(n); for(int i=1;i<=n;i++){ int num; scanf("%d:",&num); for(int j=0;j