| 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