图之Prim算法、kruskal算法和拓扑排序

原创 2015年07月06日 17:06:47

本文内容部分来源于网易云课堂浙江大学数据结构视频教程,谢谢!!!

1、最小生成树

a、先是一棵树:无回路,v个顶点一定有v-1条边;
b、是生成树:包含全部顶点,v-1条边全在图里;(向生成树中任加一条边都会形成回路)
c、边的权重和最小。
最小生成树一定是连通的,连通图中也一定能找到一棵最小生成树。

贪心算法:贪,每一步都要权重最小。约束条件:1、只能用图里的边,2、只能正好用掉v-1条边,3、不能有回路。

求最小生成树方法一:Prim算法:(让一棵小树长大)



基本思想:

从连通网N={V,E}中的某一顶点U0出发,选择与它关联的具有最小权值的边(U0,v),将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u,v),把它的顶点加入到集合U中。如此继续下去,直到网中的所有顶点都加入到生成树顶点集合U中为止。


举例,求下图的最小生成树:

从V1点出发,找到与集合U={v1}相连且权重最小的边(v1,v4),收录进来U={v1,v4},之后寻找与此时的U相连且权重最小的边(v1,v2)(注意,这时候可能有很多权重最小但相等的边,随便选一个即可),此时U={v1,v4,v2},依此类推。(注意,收录顶点时千万不能形成回路)

求最小生成树方法二:Kruskal算法(将森林合并成树)

算法过程:

1.将图各边按照权值进行排序

2.将图遍历一次,找出权值最小的边,(条件:此次找出的边不能和已加入最小生成树集合的边构成环),若符合条件,则加入最小生成树的集合中。不符合条件则继续遍历图,寻找下一个最小权值的边。

3.递归重复步骤1,直到找出n-1条边为止(设图有n个结点,则最小生成树的边数应为n-1条),算法结束。得到的就是此图的最小生成树。

Kruskal算法因为只与边相关,则适合求稀疏图的最小生成树。而prime算法因为只与顶点有关,所以适合求稠密图的最小生成树。


举例:(还是上面那个图)
发现边(v1,v2)和边(v6,v7)权重都为1,把这两条边收录进来,之后把权重为2的边(v1,v2)和边(v3,v4)加入,依此收入,但注意,收录边时千万不能形成回路


注意:连通图的最小生成树是不唯一的

2、拓扑排序

拓扑序:如果图中从V到W有一条有向路径,则V一定排在W之前。满足此条件的顶点序列称为一个拓扑序。
获得一个拓扑序的过程就是拓扑排序。
网络中如果有合理的拓扑序,则必定是有向无环图

基本思想:在图中,每次输出没有前驱的顶点。
 

拓扑排序举例:
如下网络:

每次都找入度为0的顶点,先排序C1,C2,C8,C4,在排序C3,C13,C9,C5,依次类推,排序结果如下:


拓扑结构的应用:关键路径问题

AOE网络:一般用于安排活动工序,如下图:
 

最早完成时间:Earliest[0]=0;Earliest[j]=max{Earliest[i]+C<i,j>;}
机动时间:哪几个组一天都不停,哪几个组有空闲机动时间?如上图例子,在保证18天完工的情况下,看看哪个组可以再干点别的。
机动时间D<i,j>=Latest[j]-Earliest[i]-C<i,j>
最晚完成时间:从结束点往回推,Latest[8]=18;Latest[i]=min{Latest[j]-C<i,j>;}
关键路径:由绝对不能延误的活动组成的路径(没有机动时间的路径)。
关键路径上的活动如果能加快的话,整个项目就能提前完工。
版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构 学习笔记(九):图(下):最小生成树(Prim,Kruskal 算法),拓扑排序 AOV,关键路径 AOE

最小生成树什么是最小生成树解决最小生成树有很多算法,但是归结起来都是贪心算法。贪心算法: 什么是“贪”:每一步都要最好的 什么是“好”:权重最小的边 但是因为是最小生成树,所以这个贪心算法还需要约束:...
  • Jurbo
  • Jurbo
  • 2017年07月10日 15:43
  • 760

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

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

图的最小生成树:Prim算法和Kruskal算法

1. 图的最小生成树 生成树的定义:如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树。 生成树是连通图的包含图中的所有顶点的极小连通子图。它并不唯一,从不同的顶点出发进行遍...

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

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

图的基本操作:Kruskal算法和Prim算法

图的基本操作:Kruskal算法和Prim算法 1:广度优先s

【图算法】(3)最小连通网Prim算法以及kruskal算法

1.问题的提出如何在图中选择n-1条边,使得n个顶点间两辆可达,并且这n-1条边的权值最小?设图如下所示:要求: 1.必须使用且仅使用该网络中的n-1条边来连接网络中的n个顶点 2.不能使用产生回...

Prim算法和Kruskal算法构造最小生成树

最小生成树 首先,生成树是建立在无向图中的,对于有向图,则没有生成树的概念,所以接下来讨论的图均默认为无向图。对于一个有n个点的图,最少需要n-1条边使得这n个点联通,由这n-1条边组成的子图则称为...

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

void Prim(int v) { int i,j,k,min; for(i=1;i
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图之Prim算法、kruskal算法和拓扑排序
举报原因:
原因补充:

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