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