您的位置:首页 > 其它

HDU1856 More is better (加权并查集)

2016-10-20 22:36 232 查看
近几天---并查集的日常:外链并查集

题意:这道题目的目的是想知道经过一系列的合并操作之后,查询在所有的子树中,秩的最大值是多少,简而言之,就是最大的那颗子树包含了多少个节点。

模板:

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);
}

}

}


套模板,案例很快就出来了,也注意了n==0时候的特殊情况,但是连续WA,原因是输入出了问题
一开始的输入格式:

int n = cin.nextInt();
while(cin.hasNext()){
.......
n = cin.nextInt();
}


由此可以猜测java的hasNext()方法有点像c++中的cin.peek()——只是查看输入流中的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: