管理科学基础知识__图论__最小生成树和最短路径

在软件开发中,各项任务之间怎么衔接, 才能使开发工作完成得既快又好。 可以用图论作为工具来研究和解决问题。

例如,完成工程任务的时间最少、费用最省等。

1  最小生成树

在连通的带权图的所有生成树中, 权值和最小的那棵生成树(包含图中所有顶点的树), 称作最小生成树。   求带权连通无向图的最小生成树的算法有普里姆(Prim)算法和

克鲁斯卡尔(Kruskal)算法。

    1  普里姆算法

     设已知G=(V,E)是一个带权连通无向图, 顶点V={0,1,2,... n-1}.  设U是构造生成树过程中已被考虑在生成树上的顶点的集合。 初始时,U 只包含一个出发顶点。

设T是构造生成树过程中已被考虑在生成树上的边的集合, 初始时T为空。 如果边(i, j)具在最小代价, 且i ∈U,j ∈ V-U, 那么最小代价生成树应包含边(i, j)。把j加到U中, 把(i, j)加到T中。  重复上述过程, 直到U 等于V为止。 这时,T即为要求的最小代价生成树的边的集合。

     普里姆算法的特点, 当前形成的集合T始终是一棵树。 因为每次添加的边是使树中的权尽可能小, 因此, 这是一种贪心的策略。 普里姆算法的时间复杂度为O(n²), 与图中边数无关, 适合于稠密图(边数远远大于顶点数的图)。

     2克鲁斯卡尔算法

    设T的初始状态只有n个顶点而无边的森林 T= (V,  ø),按边长递增的顺序选择E中的 n-1 安全边(u, v) 并加入T,  生成最小生成树。  所谓安全边是指两个端点分别是森林T里两棵树中的顶点的边。  加入安全边,  可将森林中的两棵树连接成一个棵更大的树,  因为每一次添加到T中的边均是当前权值最小的安全边, 这能保证最终的T是一棵最小生成树。

    克鲁斯卡尔算法的特点是当前形成的集合T 除最后的结果外, 始终是一个森林。 克鲁斯卡尔算法的时间复杂度为 O(elog₂ e),   与图中顶点数无关, 较适合于稀疏图(边数远小于顶点数的图)。

图27-1 是某地区的通信线路图, 假设其中标注的数字代表通信线路的长度(单位为千米), 现在要求至少要架设多长的线路, 才能保持6个城市的通信连通。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpbWFubmkxOA==,size_16,color_FFFFFF,t_70

解:  作为一个例子, 下面使用克鲁斯卡尔算法来解答, 如图27-2所示。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpbWFubmkxOA==,size_16,color_FFFFFF,t_70

从这个过程 图,可以看出, 先确定数量最小的路径(这种确定不是从序号靠前的顶点开始),  其次再确定数量 次小的路径,逐渐地数量增大,直到所有顶点都连接上

这个过程图, 到了第5步, 就有了多种选择, 既可以选择AF, 也可以选择BF, 因为其路程都是300千米。  

还有一种结果, 就是在第4步时,不是选择AB, 而是选择AF或者BF, 则结果如图27-3所示。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpbWFubmkxOA==,size_16,color_FFFFFF,t_70

从第6步的结果可以计算出, 至少要架设的线路长度为 200 * 2 + 300 *3 = 1300千米。

通过这个例子可以发现,  一个给定的图的最小生成树不一定是唯一的, 但不管有多少棵最小生成树, 其权值之和是相等的。

 

现在使用普里姆算法解答本题,   要实现普里姆算法,需要记录各个顶点是否已经并入U

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpbWFubmkxOA==,size_16,color_FFFFFF,t_70

同样地, 计算出最后结果是1300千米。

 

2  最短路径

带权图的最短路径问题即求两个顶点间长度最短的路径。  其中路径长度不是指路径上边数的总和, 而是指路径上各边的权值总和。  

  2.1  单源最短路径

已知有向带权图G=(V,E), 找出从某个源点s ∈ V到V中其余各顶点的最短路径, 称为单源最短路径。

目前, 求单源最短路径主要使用迪杰斯特拉( Dijkstra )提出的一种按路径长度递增次序产生各顶点最短路径的算法。若按长度递增的次序生成从源点 s 到其他顶点的最短路径, 则当前正在生成的最短路径上除终点以外, 其余顶点的最短路径均已生成。

迪杰斯特拉算法的基本思想是: 设S 为最短距离已确定的顶点集(看作红点集),  V-S 是最短距离尚未确定的顶点集(看作蓝点集)。

仅从理论上理解,有些费劲, 现在我们看一个例子, 来加深理解。

例:  如图27-4所示,  有一批货物要从城市 s 发送到城市t,  线条上的数字代表通过这条路的费用(单位为万元)。  那么, 运送这批货物,  至少需要花费多少?

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpbWFubmkxOA==,size_16,color_FFFFFF,t_70

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值