大意:多组数据。每组数据中,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(); } } }