Loading docs/graph/mst.md +62 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,68 @@ for (edge(u, v, len) in sorted(edges)) { 排序的复杂度为 $O(m \log m)$,或 $O(m)$(假设能基数排序)。 那么让我们模拟一下: 先上数据: ``` 4 5 1 2 2 1 3 2 1 4 3 2 3 4 3 4 3 ``` 图是这样的:  我们用 $F$ 表示并查集, $E$ 表示排序后的结构体,下面是初始的状态: $F$: | 编号 | 1| 2 | 3 | 4 | | -----------: | -----------: | -----------: | -----------: | -----------: | | 祖宗 | 1 | 2 | 3 | 4 | $E$: | 编号 | 1 | 2 | 3 | 4 | 5 | | -----------: | -----------: | -----------: | -----------: | -----------: | -----------: | | start | 1 | 1 | 1 | 3 | 2 | | to | 2 | 3 | 4 | 4 | 3 | | cost | 2 | 2 | 3 | 3 | 4 | 首先我们发现 1,2 是最小的,于是我们在 1 与 2 建了一条边,由于这是第一次嘛,肯定不会出现环了,并且将 1 和 2 加入一个集合:  $F$: | 编号 | 1| 2 | 3 | 4 | | -----------: | -----------: | -----------: | -----------: | -----------: | | 祖宗 | 1 | 1 | 3 | 4 | 接着发现 1,3,判断 3 和 1 的是不是在一个集合?发现不是,于是将 3 加进去,并且标记 3 归属1。  $F$: | 编号 | 1| 2 | 3 | 4 | | -----------: | -----------: | -----------: | -----------: | -----------: | | 祖宗 | 1 | 1 | 1 | 4 | 发现 1,4,同时 1 和 4 不在一个集合,于是将 4 加进去,标记 4 也归属 1。  | 编号 | 1| 2 | 3 | 4 | | -----------: | -----------: | -----------: | -----------: | -----------: | | 祖宗 | 1 | 1 | 1 | 1 | 此时,边数为点数 $-1$,整个最小生成树完成了,代价是 $2+2+3=7$。 ### “集合”数据结构的一种实现 只要支持两个接口:find_set 和 merge。 Loading Loading
docs/graph/mst.md +62 −0 Original line number Diff line number Diff line Loading @@ -56,6 +56,68 @@ for (edge(u, v, len) in sorted(edges)) { 排序的复杂度为 $O(m \log m)$,或 $O(m)$(假设能基数排序)。 那么让我们模拟一下: 先上数据: ``` 4 5 1 2 2 1 3 2 1 4 3 2 3 4 3 4 3 ``` 图是这样的:  我们用 $F$ 表示并查集, $E$ 表示排序后的结构体,下面是初始的状态: $F$: | 编号 | 1| 2 | 3 | 4 | | -----------: | -----------: | -----------: | -----------: | -----------: | | 祖宗 | 1 | 2 | 3 | 4 | $E$: | 编号 | 1 | 2 | 3 | 4 | 5 | | -----------: | -----------: | -----------: | -----------: | -----------: | -----------: | | start | 1 | 1 | 1 | 3 | 2 | | to | 2 | 3 | 4 | 4 | 3 | | cost | 2 | 2 | 3 | 3 | 4 | 首先我们发现 1,2 是最小的,于是我们在 1 与 2 建了一条边,由于这是第一次嘛,肯定不会出现环了,并且将 1 和 2 加入一个集合:  $F$: | 编号 | 1| 2 | 3 | 4 | | -----------: | -----------: | -----------: | -----------: | -----------: | | 祖宗 | 1 | 1 | 3 | 4 | 接着发现 1,3,判断 3 和 1 的是不是在一个集合?发现不是,于是将 3 加进去,并且标记 3 归属1。  $F$: | 编号 | 1| 2 | 3 | 4 | | -----------: | -----------: | -----------: | -----------: | -----------: | | 祖宗 | 1 | 1 | 1 | 4 | 发现 1,4,同时 1 和 4 不在一个集合,于是将 4 加进去,标记 4 也归属 1。  | 编号 | 1| 2 | 3 | 4 | | -----------: | -----------: | -----------: | -----------: | -----------: | | 祖宗 | 1 | 1 | 1 | 1 | 此时,边数为点数 $-1$,整个最小生成树完成了,代价是 $2+2+3=7$。 ### “集合”数据结构的一种实现 只要支持两个接口:find_set 和 merge。 Loading