7.4 图的连通性问题
最小生成树
普里姆算法、克鲁斯卡尔算法
最小生成树
问题提出
要在n个城市间建立通信联络网,
顶点——表示城市
权——城市间建立通信线路所需花费代价
希望找到一棵生成树,它的每条边上的权值之和(即建立
该通信网所需花费的总代价)最小———最小代价生成树
n个城市间,最多可设置n(n-1)/2条线路
n个城市间建立通信网,只需n-1条线路
- 问题转化为:如何在可能的线路中选择n-1条,能把
所有城市(顶点)均连起来,且总耗费
(各边权值之和)最小
构造最小生成树方法
普里姆(Prim)算法/T(n)=O(V²)
算法思想:
- 设连通网N=(V,{E}),
点集U为已处理点集,最小生成树边集TE。 - 初始任取一点,加入U,使U={v0};
- 在所有u∈U,v∈V-U的边(u,v)∈E中,找一条代价最小的边(u0,v0)
两点确定一条边,即在所有生成树邻接的边里找条最小的。
- 将(u0,v0)并入集合TE,同时v0并入U
把边并入生成树,点并入已处理点集。
- 重复操作直至U=V。
克鲁斯卡尔(Kruskal)算法/O(E log E)
算法思想:
- 设连通网N=(V,{E}),
初始状态为只有n个顶点而无边的非连通图T=(V,{∅}),每个顶点自成一个连通分量 - 在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中;
- 否则,舍去此边,选取下一条代价最小的边依此类推,直至T中所有顶点都在同一连通分量上为止。
一开始所有点各自独立,遍历E集合选代价最小边,若该边的两个顶点落在不同连通分量上,就加进T,直到T里所有顶点全在一个连通分量上。