图之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算法 简述

Prim算法和Kruskal算法,都是用来找出图中最小生成树的算法,两个算法有些小差别。 Prim算法 又称普里姆算法,以图上的顶点为出发点,逐次选择到最小生成树顶点集距离最短的顶点为最小生成...
  • jerry81333
  • jerry81333
  • 2017年01月25日 06:28
  • 749

关于Kruskal算法和Prim算法的个人理解

Kruskal和Prim算法都是用来计算最小生成树的算法。 总的来说应该可以算是图论那里比较基础的部分了,之前也有学习过,不过其实了解的也就是一知半解。说是能说,但是实际上的理解根本不够透彻。(...
  • dy13145687
  • dy13145687
  • 2015年04月22日 22:56
  • 1310

最小生成树Prim与Kruskal算法的比较

最小生成树是图论问题中很基本的一个操作。常用的算法有Prim和Kruskal两种算法。本文对这两种算法稍作区别与讨论。Prim算法是依赖于点的算法。它的基本原理是从当前点寻找一个离自己(集合)最近的点...
  • Mollnn
  • Mollnn
  • 2016年09月19日 21:48
  • 3768

【最小生成树】Prim算法和Kruskal算法的区别对比

Prim算法和Kruskal算法都是从连通图中找出最小生成树的经典算法。从策略上来说,Prim算法是直接查找,多次寻找邻边的权重最小值,而Kruskal是需要先对权重排序后查找的。 所以说,Kr...
  • liuchuo
  • liuchuo
  • 2016年12月21日 21:59
  • 1676

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

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

Prim算法和Kruskal算法模板

void createGraph(){ //lowcost表示每个点的最小花费,closet表示最小花费对应相连的点,visited区分两个集合 memset(graph,0,size...
  • litianxiang_kaola
  • litianxiang_kaola
  • 2016年11月06日 13:19
  • 391

Prim算法和Kruskal算法的基本思想和实现

这两个都是求最小生成树的算法,个人更喜欢Kruskal算法。Prim算法基本思想有两个集合,A是空集,B集合里有现在图中的所有边。 将B中任意一点加入A集合,在这个点的所用通路中选择一个权值最小的边...
  • SCaryon
  • SCaryon
  • 2017年06月28日 22:14
  • 936

关于最小生成树的Prim算法和Kruskal算法

针对一些城市之间建造公路或者造桥问题,我们需要的是以最小代价完成任务,看了一下别人的代码,思想其实都是差不多,但是感觉不大好理解,比如Kruskal算法中有人写了利用递归实现判断是否形成环,本人愚钝,...
  • chenxinabcd
  • chenxinabcd
  • 2016年09月05日 14:52
  • 1009

图 之 MST(最小生成树 — kruskal算法 )并查集实现

#并查集的优化: (1)       Find_Set(x)时,路径压缩寻找祖先时,我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度。为...
  • PeersLee
  • PeersLee
  • 2015年12月26日 17:41
  • 1785

Prime算法 与 Kruskal算法的时间复杂度比较

转自G机器猫 评测环境:WindowsXP,FreePascal2.40,Pentium(R) Dual-Core CPU T4300@2.10GHz,2G内存 ...
  • Haskei
  • Haskei
  • 2016年11月11日 20:23
  • 4127
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图之Prim算法、kruskal算法和拓扑排序
举报原因:
原因补充:

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