题意:给出几组数据,代表学生之间的宗教信仰是一样的,现在要求出最大的学生宗教信仰数。
并查集算法:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxx=5e4+10;
int pre[maxx];
int rank[maxx];
int a[maxx];
int n,m;
int vis[maxx];
int ans;
struct node{
int x,y;
}num[maxx];
void init(int n){
for(int i=0;i<=n;i++){
pre[i]=i;
rank[i]=0;
a[i]=0;
}
}
int find(int x){
int r=x;
if(pre[x]==r){
return x;
}
return pre[x]=find(pre[x]);
}
void unio(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx==fy){
return;
}
ans--;
if(rank[fx]>rank[fy]){
pre[fy]=fx;
}else{
pre[fx]=fy;
if(rank[fx]==rank[fy]){
rank[fx]++;
}
}
}
int main(){
int count=1;
while(scanf("%d %d",&n,&m)){
if(n==0&&m==0)break;
init(n);
memset(vis,0,sizeof(vis));
int k=1;
ans=n;
for(int i=1;i<=m;i++){
int x,y;
scanf("%d %d",&x,&y);
unio(x,y);
}
/*
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(i!=j){
if(find(i)==find(j)&&vis[i]==0&&vis[j]==0){
ans--;
vis[j]=1;
}
}
}
vis[i]=1;
}
*/
/*
cout<<"Case "<<count++<<": "<<ans<<endl;
}
return 0;
}