普利姆(Prim)算法是以某个顶点为起点,逐步寻找各个顶点上权值最小的边来构建生成树。
文章指引:图—普里姆(Prim)算法(原理和C程序解释)
而克鲁斯卡尔(Kruskal)算法是以边为目标,直接寻找权值最小的边来构建生成树,并在构建中不形成回路。
一、定义
假设N = (V, {E})是一个连通网,则令最小生成树的初始状态为只有n个顶点而无边的非连通图T = {V, {}},图中每个顶点自成一个连通分量。
在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。依次类推,直至T中所有顶点都在同一连通分量上为止。
二、实现思路
下图是一个连通网,我们以此来介绍普利姆算法的实现过程。
(1)首先设立最小生成树的初始状态T = {V, {}},只有顶点,没有边,寻找权值最小的边,显然是 ( v 1 , v 5 ) (v_1,v_5) (v1,v5)最小。
注:红色边为最小生成树的边,黑色线为连通网的边。
(2)然后 ( v 1 , v 7 ) (v_1,v_7) (v1,v7)边权值最小
(3)此时有两条边的权值均为8,这里先取 ( v 0 , v 1 ) (v_0,v_1) (v0,v1)边
(4)添加 ( v 4 , v 5 ) (v_4,v_5) (v4,v5)边
(5)添加 ( v 3 , v 7 ) (v_3,v_7) (v3,v7)边
(6)因为 ( v 2 , v 3 ) (v_2,v_3) (v