给你一个 $n$ 个点的带权无向连通图,节点编号为 $0$ 到 $n-1$ ,同时还有一个数组 $edges$ ,其中 $edges[i] = [from_i, to_i, weight_i]$ 表示在 $from_i$ 和 $to_i$ 节点之间有一条带权无向边。最小生成树 (MST) 是给定图中边的一个子集,它连接了所有节点且没有环,而且这些边的权值和最小。
请你找到给定图中最小生成树的所有关键边和伪关键边。如果从图中删去某条边,会导致最小生成树的权值和增加,那么我们就说它是一条关键边。伪关键边则是可能会出现在某些最小生成树中但不会出现在所有最小生成树中的边。
请注意,你可以分别以任意顺序返回关键边的下标和伪关键边的下标。
示例 1:
1 | 输入:n = 5, edges = [[0,1,1],[1,2,1],[2,3,2],[0,3,2],[0,4,3],[3,4,3],[1,4,6]] |
示例 2 :
1 | 输入:n = 4, edges = [[0,1,1],[1,2,1],[2,3,1],[0,3,1]] |
这题的关键是找边,所以只能用最小生成树的 Kruskal 算法。
我们先给所有边编号,先求一遍最小生成树的权值和 $value$,然后依次遍历所有边 $i$,先算去掉边 $i$ 的最小生成树的权值和 $v$,若此时无法构造最小生成树或者 $v>value$,则这条边一定是关键边;再算伪关键边,我们加上这条边的权值,再算一次最小生成树的权值和 $v$,若 $v=value$,证明该边没有出现在所有的最小生成树中,一定是伪关键边,AC代码如下:
1 | class Unionset { |