图算法:最小生成树与最短路径
1. 最小生成树概述
想象一块木板上有许多钉子,它们通过绳子相互连接。假设沿着一条或多条绳子可以从任意一个钉子到达其他钉子,现在有一个游戏,目标是移除一些绳子,使得所有钉子仍然保持连接,同时使用的绳子总长度最短。这就是最小生成树的概念。
形式上,对于一个无向加权图 $G = (V, E)$,最小生成树是 $E$ 中边的集合 $T$,它以最小的成本连接 $V$ 中的所有顶点。$T$ 中的边构成一棵树,因为除了作为树的根的第一个顶点外,每个顶点在生成过程中都恰好有一个前置顶点作为其父节点。
1.1 Prim 算法
Prim 算法是计算最小生成树的一种方法。它通过一次添加一条边来逐步构建最小生成树,每次选择当前看起来最优的边。由于这种选择方式,Prim 算法属于贪心算法(虽然贪心算法通常只能得到近似解,但 Prim 算法能得到最优结果)。
1.1.1 算法基本原理
该算法反复选择一个顶点,并探索与该顶点相连的边,以确定是否有更有效的方式来连接到目前为止已经探索过的顶点。它类似于广度优先搜索,因为在深入图之前,它会先探索一个顶点的所有相连边。
为了在每一步确定要选择的顶点,我们为每个顶点维护一个颜色和一个键值。初始时,所有顶点的颜色设为白色,键值设为一个任意大的值(大于图中任何边的权重),而开始生成的顶点的键值设为 0。随着算法的进行,除了起始顶点外,所有顶点都会在最小生成树中被分配一个父节点。只有当一个顶点被染成黑色时,它才成为最小生成树的一部分,在此之前,它的父节点可能会发生变化。
1.1.2 算法步骤
- 从图中