图的算法

392 阅读2分钟

最小生成树

最小生成树是一副连通加权无向图中一棵权值最小的生成树。

本节参考:zhuanlan.zhihu.com/p/34922624

总的来说,Prim算法是以点为对象,挑选与点相连的最短边来构成最小生成树。而Kruskal算法是以边为对象,不断地加入新的不构成环路的最短边来构成最小生成树。

1、普利姆算法

1)以某一个点开始,寻找当前该点可以访问的所有的边;

2)在已经寻找的边中发现最小边,这个边必须有一个点还没有访问过,将还没有访问的点加入我们的集合,记录添加的边;

3)寻找当前集合可以访问的所有边,重复2的过程,直到没有新的点可以加入;

4)此时由所有边构成的树即为最小生成树。

2、克鲁斯卡尔算法

现在我们假设一个图有m个节点,n条边。首先,我们需要把m个节点看成m个独立的生成树,并且把n条边按照从小到大的数据进行排列。在n条边中,我们依次取出其中的每一条边,如果发现边的两个节点分别位于两棵树上,那么把两棵树合并成为一颗树;如果树的两个节点位于同一棵树上,那么忽略这条边,继续运行。等到所有的边都遍历结束之后,如果所有的生成树可以合并成一条生成树,那么它就是我们需要寻找的最小生成树,反之则没有最小生成树。

最短路径

从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径

1、迪杰斯特拉算法

求v0到v8的最短路径:先求出v0到v1、v2的最短路径,再求出v0到v3、v4、v5的最短路径,然后求出v0到v6、v7的最短路径,最后求出v0到v8的最短路径

2、弗洛伊德算法

弗洛伊德算法把所有顶点到所有顶点的最短路径全部算了出来

拓扑排序

参考文献: blog.csdn.net/lisonglison…

1、拓扑排序算法

关键路径

参考文献:www.cnblogs.com/Braveliu/p/…

1、关键路径算法

参考文献:www.jianshu.com/p/1857ed4d8…