图之最小生成树 Kruskal算法 Prim算法

原创 2016年08月28日 23:40:50

一.实际问题

最小生成树一般应用在网(带权的图)问题中,实际问题一般比如:
  假设要在n个城市间建立通信联络网,则联通n个城市只需要n-1条线路,但是每两个城市间都可以建设路线,而且城市与城市间建设代价是不同的,这就需要我们考虑一种经济的联络方式。
将问题转换成图的话,就如下图(圆圈代表城市,线代表线路,线上数值代表建设的代价),我们需要从中选择一条代价最小的建设方式。
这里写图片描述

二.基本思想

  一般情况下这类问题归于动态规划中的贪心算法(不一定是但大多数情况下是最优解)。
  这里写图片描述
  跟动态规划一样,我们假设上图弧线以下部分(白色圆圈c,i,h,g,f部分)已经找到最优解的话,那么我们考虑添加一个黑色圆圈时,只需要考虑白色圆圈c,i,h,g,f部分到黑色园圈所有线路中代价最小的线路与黑色园圈相连组成新的子问题最优解(比如白色圆圈c,i,h,g,f部分到最左边黑色圆圈有代价8或11线路,显然我们选择线路代价为8)。接下来介绍的Kruskal和Prim算法其基本思想大抵如此。

三.Kruskal算法

适合求解边稀疏网的最小生成树

克鲁斯卡尔算法首先把每一个节点当成一最小生成棵树,把所有的边从代价小到大排列。
然后逐个选择边(从小到大):
  判断边是否连接两个最小生成树,如果能够连接则把两棵最小生成树连接起来生成一个最小生成树;   如果这条边连接的是一棵树内两个节点的话就抛弃它,为什么呢?因为我们是从小到大选择的边,如果把当前这条边加入这棵树的话,树内必定会生成一个回路,就需要抛弃一条边,然而先前选择的所有的边都比当前这条边代价小,所以只能抛弃当前这条边。
  这里写图片描述
看上述示意图中,红圈部分就是代价高的线路被抛弃了。
算法实例:CCF 地铁修建

四.Prim算法

适合求解边稠密网的最小生成树

普西姆算法与克鲁斯卡尔算法不同,普西姆算法从始到终都只有一棵树。
首先选择任意一个顶点当成一棵树,把(树)和(其他节点)当成两个集合;
然后我们从(其他节点)到(树)线路中选择代价最小的线路,这条线路的端节点必然一个在(树)中,一个在(其他节点)中。把该条最小代价线路在(其他节点)集合中的节点转移到(树)中,从而形成新的最小生成树。重复上述步骤,到最后所有的节点都在(树)集合中。
这里写图片描述
看上述示意图中,始终只有黑色圆圈组成的(树),在只有一个黑点(图1)时,(树)与(其他集合)有两条线路,代价分别为4或8,显然选择4;
然后(树)与(其他集合)间线路就有8或11或8,按贪心算法,我们只需考虑一个子问题,所以选择其中一条代价为8的线路即可。
CCF 最优灌溉
算法实例:CCF 交通规划

版权声明:

相关文章推荐

C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

1、Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树。 2、Kruskal 算法 直接寻找最小权值的边来构建最小生成树。 比较: Kruskal 算法主要是针对边来展开,边数...

最小生成树-Prim算法和Kruskal算法

#define MAX 100000 #define VNUM 10+1 //这里没有ID为0的点,so i...

最小生成树(prim算法,kruskal算法)

对于边上有权的图来说,边权值和最小的生成树叫做这个图的最小生成树。如果一个图的边权值都不相同那么最小生成树是唯一的。 求无向图的最小生成树主要有prim算法和kruskal算法两个。 prim算法思想...

最小生成树(Prim算法和Kruskal算法)—理解与论证

向世界分享科学之美,让科学流行起来          对于一个给定的连通无向图G=(V,E),其最小生成树被定义如下:取边集E中的子集E‘构成连通树,同时满足,其中表示边(集...

hdu 1102 最小生成树 prim算法+Kruskal算法(并查集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102题目大意:给定n个村庄,及各村庄间修路的费用,求要使各村庄连通的最小费用,要注意的是,有些村庄间已...

HDU 1233.还是畅通工程【最小生成树 kruskal算法(并查集)+prim算法】【1月8】

还是畅通工程 Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的...

最小生成树-Prim算法和Kruskal算法

Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex ...

最小生成树之Kruskal算法和Prim算法

根据图的深度优先遍历和广度优先遍历,可以用最少的边连接所有的顶点,而且不会形成回路。这种连接所有顶点并且路径唯一的树型结构称为生成树或扩展树。实际中,希望产生的生成树的所有边的权值和最小,称之为最小生...

Prim算法求最小生成树MST以及和kruskal算法的对比

1.解析Prim算法和Dijkstra算法非常类似,他们的伪码几乎相近,只是他们优先队列所排序的键值不同而已。Prim算法的键值为节点与集合S中顶点间的最轻边的权重,而在Dijkstra算法中,键值为...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)