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里所有顶点全在一个连通分量上。

posted @ 2020-08-14 20:34  夜明_Yoake  阅读(126)  评论(0编辑  收藏  举报