108. 冗余连接
并查集应用类题目,关键是如何把题意转化成并查集问题
import java.util.Scanner;
import java.util.Vector;
public class UnionFind {
private Vector<Integer> parent;
private int size;
public UnionFind(int size) {
this.size = size;
this.parent = new Vector<>(size + 1);
for (int i = 0; i <= size; i++) {
parent.add(i);
}
}
public int find(int u) {
return (u == parent.get(u)) ? u : (parent.set(u, find(parent.get(u))), parent.get(u));
}
public boolean isSame(int u, int v) {
return find(u) == find(v);
}
public void union(int u, int v) {
int rootU = find(u);
int rootV = find(v);
if (rootU != rootV) {
parent.set(rootV, rootU);
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
UnionFind uf = new UnionFind(n);
for (int i = 0; i < n; i++) {
int s = scanner.nextInt();
int t = scanner.nextInt();
if (uf.isSame(s, t)) {
System.out.println(s + " " + t);
return;
} else {
uf.union(s, t);
}
}
}
}
109. 冗余连接II
上面两道题目是不是感觉做出自信了,感觉并查集不过如此?
来这道题目 给大家适当一些打击, 难度上来了。
import java.util.ArrayList;
import java.util.List;
List<Integer> vec = new ArrayList<>();
for (int i = n - 1; i >= 0; i--) {
if (inDegree[edges[i][1]] == 2) {
vec.add(i);
}
}
if (!vec.isEmpty()) {
if (isTreeAfterRemoveEdge(edges, vec.get(0))) {
System.out.println(edges[vec.get(0)][0] + " " + edges[vec.get(0)][1]);
} else {
System.out.println(edges[vec.get(1)][0] + " " + edges[vec.get(1)][1]);
}
return;
}