Unverified Commit 18111530 authored by ddjxd's avatar ddjxd Committed by GitHub
Browse files

Update mst.md

parent 31a8cb1a
Loading
Loading
Loading
Loading
+62 −0
Original line number Diff line number Diff line
@@ -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
```
图是这样的:

![](https://i.loli.net/2018/08/15/5b739e33e0140.png)

我们用 $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 加入一个集合:

![](https://i.loli.net/2018/08/15/5b73a1ccefad4.png)

$F$:

| 编号 | 1| 2  | 3 | 4 |
| -----------: | -----------: | -----------: | -----------: | -----------: |
| 祖宗 | 1 | 1 | 3 | 4 |

接着发现 1,3,判断 3 和 1 的是不是在一个集合?发现不是,于是将 3 加进去,并且标记 3 归属1。

![](https://i.loli.net/2018/08/15/5b73a376290ac.png)

$F$:

| 编号 | 1| 2  | 3 | 4 |
| -----------: | -----------: | -----------: | -----------: | -----------: |
| 祖宗 | 1 | 1 | 1 | 4 |


发现 1,4,同时 1 和 4 不在一个集合,于是将 4 加进去,标记 4 也归属 1。

![](https://i.loli.net/2018/08/15/5b73a3f8e8d0d.png)

| 编号 | 1| 2  | 3 | 4 |
| -----------: | -----------: | -----------: | -----------: | -----------: |
| 祖宗 | 1 | 1 | 1 | 1 |

此时,边数为点数 $-1$,整个最小生成树完成了,代价是 $2+2+3=7$。

### “集合”数据结构的一种实现

只要支持两个接口:find_set 和 merge。