prim算法正确性证明
条件 : 存在带权无向图 G = (V , E),其中 V 表示途中点的集合,E 表示图中边的集合
思路1 : 可以利用反证法,不失一般性,假设第 t 步已经使用prim算法生成了一颗最小子生成树,在第 t+1 步连接 Vt+1 时 prim 算法搞错了,找到了一条错误的边 Ew:j+1,使得最小生成子树不是正确的最小生成子树,那么应该存在一条正确的边 Er:j+1 使得加入树的 Vt+1 为最小生成树,那就意味着 Ew:j+1 > Er:j+1 ,但是 prim 算法每次找到的就是最小边,即 Ew:j+1 <= Er:j+1 ,与 prim 算法矛盾,故可证明 prim 算法的正确性.
思路2 : 可以利用最优子结构(可能不对哈).可以把没有加入到最小生成树的点看成是一个集合 N ,prim 算法每次要从最小生成树 T 上找到一条到集合 M 最短的边,将 T 和 N 连接起来,并将 T 和 M 连接的点并入 T 中.
a): 随机找一个点 V1,将其他点计入 M (假设M已经是最小生成树) 中,prim找到一条最短的路径 记为 Ew:1 使得 V1 与 M 相连,构成最小生成树,假如 Prim 这一步做错了,找的的边不是最短的,那就存在另一条边 记为 Er:1 使得 V1 与 M 相连接可以构成最小生成树,那么此时应该满足如下情况 Ew:1 > E:r1,但是 prim算法找的就是最小边,所以应该为 Ew:1 <= E:r1,故矛盾,所以 prim 算法找到的应该是最短路径,后记 与 V1 相连并处于 M 中的点为 V2,将 V1 和 V2 看成一个点,并将 V2 从 M 中删除
b)现在是 N-1 的问题了,按照 a) 走就行