标签:
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
描述:当今世界有许多不同的宗教,很难对他们进行追踪。你感兴趣的是,要找出你的大学里有多少个 不同的宗教信仰的学生。你知道有n个学生在大学(0 < n <= 50000).你要求每一个学生他们的宗教信仰是不可行的。此外,许多学生不喜欢表达他们的信仰。避免这些问题的一个方法是问m (0 <= m <= n(n-1)/2)对学生,问他们是否相信相同的宗教(例如他们可能知道他们两个参加相同的教堂)。
从这个数据,你就可以了解到他们的信仰,但你可以得到一个想法的上限,有多少不同的宗教可以在校园里可能代表。你可以假设每个学生最多信仰一种宗教。
输入:输入包含多组数据。每个案例开始一行指定整数n和m。下面m行包含两个整数i和j,表示学生i和j信仰相同的宗教。学生编号1到n。最后一行中输入指定的n = m = 0。
输出:对于每个测试用例,打印一行数字编号(从1开始),其次是学生们在大学里所信仰不同宗教的最大数量。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 #define MAX 50005 6 int path[MAX]; 7 void f(int n) 8 { 9 for(int i=1; i<=n; i++) 10 { 11 path[i]=i; //初始化为自己是自己的父节点 12 } 13 } 14 int find(int x) //路径压缩 15 { 16 if(x==path[x]) 17 return path[x]; 18 return path[x]=find(path[x]); 19 } 20 int main() 21 { 22 int n,m,k=0; 23 int a,b,x,y; 24 int ans; 25 while(cin>>n>>m,n||m) 26 { 27 f(n); 28 ans=n; //初始化宗教最多为n个 29 for(int i=1; i<=m; i++) 30 { 31 cin>>a>>b; 32 x=find(a); 33 y=find(b); 34 if(x!=y) // 两者的父节点不同 35 { 36 path[y]=x; //连接 37 ans--; //同一信仰,就减一 38 } 39 } 40 printf("Case %d: ",++k); 41 cout<<ans<<endl; 42 } 43 return 0; 44 }
poj 2524 Ubiquitous Religions(并查集)
标签:
原文地址:http://www.cnblogs.com/cxbky/p/4864812.html