近几天---并查集的日常:外链并查集
题意:这道题目的目的是想知道经过一系列的合并操作之后,查询在所有的子树中,秩的最大值是多少,简而言之,就是最大的那颗子树包含了多少个节点。
模板:
import java.util.Scanner;
public class Main {
private int[] id;
private int[] sz;
private int count;
public Main(int N) {
count = N;
id = new int[N + 1];
sz = new int[N + 1];
for (int i = 1; i <= N; i++) {
id[i] = i;
sz[i] = 1;
}
}
public int count() {
return count;
}
public boolean connected(int p, int q) {
return find(p) == find(q);
}
public int find(int p) {
while (p != id[p])
p = id[p];
return p;
}
public void union(int p, int q) {
int i = find(p);
int j = find(q);
if (i == j)
return;
if (sz[i] < sz[j]) {
id[i] = j;
sz[j] += sz[i];
} else {
id[j] = i;
sz[i] += sz[j];
}
count--;
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
}
}
</span>
AC代码:
import java.util.Scanner;
public class Main {
private int[] id;
private int[] sz;
private long maxn = 1L;
public Main(int N) {
id = new int[N + 1];
sz = new int[N + 1];
for (int i = 1; i <= N; i++) {
id[i] = i;
sz[i] = 1;
}
}
public int find(int p) {
while (p != id[p])
p = id[p];
return p;
}
public void union(int p, int q) {
int i = find(p);
int j = find(q);
if (i == j)
return;
if (sz[i] < sz[j]) {
id[i] = j;
sz[j] += sz[i];
maxn = sz[j] > maxn ? sz[j] : maxn;
} else {
id[j] = i;
sz[i] += sz[j];
maxn = sz[i] > maxn ? sz[i] : maxn;
}
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
while (cin.hasNext()) {
int n = cin.nextInt();
Main ans = new Main(10000000);
int a, b;
for (int i = 0; i < n; i++) {
a = cin.nextInt();
b = cin.nextInt();
ans.union(a, b);
}
System.out.println(ans.maxn);
}
}
}
一开始的输入格式:
int n = cin.nextInt();
while(cin.hasNext()){
.......
n = cin.nextInt();
}