一、题目描述
找到最小生成树里的关键边和伪关键边。
给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti] 表示在 fromi 和 toi 节点之间有一条带权无向边。最小生成树 (MST) 是给定图中边的一个子集,它连接了所有节点且没有环,而且这些边的权值和最小。请你找到给定图中最小生成树的所有关键边和伪关键边。
如果从图中删去某条边,会导致最小生成树的权值和增加,那么我们就说它是一条关键边。伪关键边则是可
能会出现在某些最小生成树中但不会出现在所有最小生成树中的边。
请注意,你可以分别以任意顺序返回关键边的下标和伪关键边的下标。
二、理解题意
三、解法一:Kruskal算法
private int[] parent;
private int[][] edgesCopy;
public void init(int n) {
if (parent == null)
parent = new int[n];
for (int i = 0; i < n; ++i) {
parent[i] = i;
}
}
public int find(int i) {
while (parent[i] != i) {
i = parent[i];
parent[i] = parent[parent[i]];
}
return parent[i];
}
public boolean union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
parent[rootX] = rootY;
return true;
}
return false;
}
public int kruskal(int[][] edges, int n, int index, boolean giveOrTake) {
// 初始化并查集
init(n);
/* 伪关键边处理 */
int mstWeightSum = 0, mstEdgeCount = 0;
if (!giveOrTa