您的位置:首页 > 其它

poj2524(并查集)

2017-05-23 19:27 225 查看
点击打开题目链接

大意:多组数据。每组数据中,n个学生,每个学生信最多一种教。给出m对学生信息,每对中两个学生信的教一样。

求这n个学生信教种数最多有多少。

思路:并查集,基础练手题

代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

class Reader {
static BufferedReader reader;
static StringTokenizer tokenizer;

static void init(InputStream input) {
reader = new BufferedReader(new InputStreamReader(input));
tokenizer = new StringTokenizer("");
}

static String next() throws IOException {
while (!tokenizer.hasMoreTokens()) {
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}

static int nextInt() throws IOException {
return Integer.parseInt(next());
}
}

public class Main {

/**
* @param args
*/
static int ans, n, m, pa, pb, u, v, casenum;
static int p[], rank[];

private static int father(int u) {
if (u == p[u])
return u;
p[u] = father(p[u]);
return p[u];
}

private static void merge(int a, int b) {
pa = father(a);
pb = father(b);
if (pa != pb) {
if (rank[pa] < rank[pb])
p[pa] = pb;
else
p[pb] = pa;
if (rank[pa] == rank[pb])
rank[pa]++;
}
}

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Reader.init(System.in);
p = new int[50001];
rank = new int[50001];
n = Reader.nextInt();
m = Reader.nextInt();
casenum = 0;
while ((n != 0) || (m != 0)) {
casenum++;
for (int i = 1; i <= n; i++) {
p[i] = i;
rank[i] = 1;
}
for (int i = 1; i <= m; i++) {
u = Reader.nextInt();
v = Reader.nextInt();
merge(u, v);
}
ans = 0;
for (int i = 1; i <= n; i++)
if (p[i] == i)
ans++;
System.out.println("Case " + casenum + ": " + ans);
n = Reader.nextInt();
m = Reader.nextInt();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 acm poj 并查集