| Time Limit: 5000MS | Memory Limit: 65536K | |
| Total Submissions: 25316 | Accepted: 12489 |
Description
Input
Output
Sample Input
10 9 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 10 4 2 3 4 5 4 8 5 8 0 0
Sample Output
Case 1: 1 Case 2: 7
Hint
题意:在一个大学里面有的学生信仰多少个不同的宗教,注意一点就是下面没出现的学生,视为他们各自信仰不同的宗教
并查集模板:
int father[MAX],rank[MAX];
void init(int n){
for (int i=1;i<=n;i++){
father[i]=i;
rank[i]=1;
}
}
int find(int x){
if (x!=father[x])
father[x] = find(father[x]); //路径压缩
return father[x];
}
void Union(int x,int y){
int i=find(x);
int j=find(y);
if (i==j)
return;
if (rank[i]<rank[j])
father[i]=j;
else{
father[j]=i;
if (rank[i]==rank[j]) //两棵树同高
rank[i]++;
}
}
bool same(int x,int y){
return find(x)==find(y);
}#include <iostream>
#include <stdio.h>
using namespace std;
int father[50000+1],rank[50000+1];
void init(int n){
for (int i=1;i<=n;i++){
father[i]=i;
rank[i]=1;
}
}
int find(int x){
if (x!=father[x])
father[x] = find(father[x]); //路径压缩
return father[x];
}
void Union(int x,int y){
int i=find(x);
int j=find(y);
if (i==j)
return;
if (rank[i]<rank[j])
father[i]=j;
else{
father[j]=i;
if (rank[i]==rank[j]) //两棵树同高
rank[i]++;
}
}
int main(){
int n,m,x,y,num=1;
while (cin>>n>>m){
if (n==0&&m==0)
break;
init(n);
for (int i=0;i<m;i++){
cin>>x>>y;
Union(x,y);
}
int ans=0;
for (int i=1;i<=n;i++){
if (i==father[i])
ans++;
}
cout<<"Case "<<num<<": "<<ans<<endl;
num++;
}
return 0;
}
原文:http://blog.csdn.net/codeforcer/article/details/42031467