Prim算法
连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的。最小生成树是连通图的一个连通分量,且所有边的权值和最小。
最小生成树中,一个顶点最多与两个顶点邻接;若连通图有n个顶点,则最小生成树中一定有n-1条边。
Prim算法需要两个线性表来进行辅助:
- visited:
标记已经加入生成树的顶点;(它的功能可以由tree取代)
初始状态:生成树根节点为真,其它为0。
- tree:
记录生成树,tree[x]保存顶点x的直接根节点下标,若x为树的根节点则tree[x]为其自身。
初始状态:根节点为其自身,其它顶点为NULL。
- low:
low[i]记录生成树中顶点与生成树外顶点i所有边中的最小值。
初始状态:生成树根节点与其它边之间的权值。
Prim算法采用贪心的思想进行设计:
(1) 初始化:将起始点加入生成树中
(2) 在生成树中的顶点与其它顶点之间的边中寻找最小的边加入生成树中(更新visited,tree);
(3) 搜索新加入顶点与所有生成树外顶点i之间边,若小于原有low[i]则更新low[i];
(4) 重复执行,直至生成树中包含了所有顶点。
Prim算法与Dijsktra算法非常类似,两者在执行过程上的显著区别在于:Prim算法按边进行搜索,将