poj2524(并查集)

来源:互联网 发布:mac ndk下载地址 编辑:程序博客网 时间:2024/04/30 13:50

点击打开题目链接


大意:多组数据。每组数据中,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;elsep[pb] = pa;if (rank[pa] == rank[pb])rank[pa]++;}}public static void main(String[] args) throws IOException {// TODO Auto-generated method stubReader.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();}}}