| Time Limit: 5000MS | Memory Limit: 65536K | |
| Total Submissions: 23947 | Accepted: 11792 |
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
Source
import java.util.Arrays;
import java.util.Scanner;
public class poj2524 {
public static int[] f;
public static int n;
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int k = 0;
n = cin.nextInt();
int m = cin.nextInt();
while (n != 0 && m != 0) {
f = new int[n + 6];
for (int i = 0; i <= n; i++) {
f[i] = i;//初始化父节点为自身
}
for (int i = 1; i <= m; i++) {
int a = cin.nextInt();
int b = cin.nextInt();
a = find(a);//找到祖先节点
b = find(b);
f[a] = b;//将a的父节点定为b,将a连接到b上
}
for (int i = 1; i <= n; i++) {
find(i);//连接剩余可以再连接的节点
}
int sum = 0;
Arrays.sort(f, 1, n + 1);
for (int i = 1; i <= n; i++) {
if (f[i] != f[i - 1])
sum++;
}
System.out.println("Case " + (++k) + ": " + sum);
n = cin.nextInt();
m = cin.nextInt();
}
}
static int find(int x) {
if (f[x] != x) {//若有父节点,即x不是祖先节点
//将x的父节点赋值为x的祖先节点
//并将父节点到祖先节点的途中的节点全部连接到祖先节点上
f[x] = find(f[x]);
}
return f[x];//此时的f[x]已经是x的祖先节点
}
}
并查集
题目大意:输入两个整数n和m,n表示有n个学生,下面有m行,每行两个数表示两个学生信仰同一个宗教,两个0是结束标记,输出学校最多有几个宗教
POJ2524,Ubiquitous Religions,布布扣,bubuko.com
原文:http://blog.csdn.net/ieayoio/article/details/38259031