图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)相关的知识,希望对你有一定的参考价值。

带权无向图—>最小生成树算法—>Prim算法:

在这里插入图片描述

思路:
首先,我们先设置两个集合,U_{}:一个用来放最小生成树的顶点,T_{}:一个用来放最小生成树的边。选取最开始的点V_0,将V_0放入U_{}中,得到U_{V_0},然后从V_0出发的边中选权值最小的,把该边的另外一个点加入集合U中,把边加入集合T中,重复该操作,直到集合U中含图的全部点,最小生成树构造完毕。

代码如下:
Prim

带权无向图—>最小生成树算法—>Kruskal算法:

在这里插入图片描述

思路:
首先,我们先得到该图的最小生成树,只不过没有边,全部是点,然后按照边的权值从小到大排序,然后开始从小到大选边,只要不会让目前的最小生成树生成回路的边就可以选,最后形成完整的最小生成树。

代码如下:
Kruskal

带权有向图—>最短路径算法—>单源最短路径算法—>Dijkstra算法:

思路:
首先,我们先设置两个集合,U1_{}:一个用来放已找到最短路径的顶点,U2_{}:一个用来放当前还未找到最短路径的顶点。选取最开始的点V_0,将V_0放入U1_{}中,得到U1_{V_0},初始状态,集合U1中只有V_0,然后从U2_{}不断选取到V_0路径长度最短的点,将该点放入集合U1_{},U1_{}每次放入新点,都要修改顶点V_0到集合U2_{}剩余顶点的最短路径长度值,不断重复该过程,直到集合U2_{}中的点全部放入集合U1_{}中。

代码如下:
Dijkstra

带权有向图—>最短路径算法—>每对顶点之间的最短路径算法—>Floyd算法:

思路:
假设求从顶点vi到vj的最短路径。如果从vi到vj有弧,则从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,尚需进行n次试探。首先考虑路径(vi, v0, vj)是否存在(判别弧(vi, v0)和(v0, vj)是否存在)。如果存在,则比较(vi, vj)和(vi, v0, vj)的路径长度,取长度较短者为从vi到vj的中间顶点的序号不大于0的最短路径。假如在路径上再增加一个顶点v1,也就是说,如果(vi, …, v1)和(v1, …, vj)分别是当前找到的中间顶点的序号不大于0的最短路径,那么(vi, …, v1, … , vj)就有可能是从vi到vj的中间顶点的序号不大于1的最短路径。将它和已经得到的从vi到vj中间顶点序号不大于0的最短路径相比较,从中选出中间顶点的序号不大于1的最短路径之后,再增加一个顶点v2,继续进行试探,依此类推。在一般情况下,若(vi, …, vk)和(vk, …, vj)分别是从vi到vk和从vk到vj的中间顶点的序号不大于k-1的最短路径,则将(vi, …, vk, …, vj)和已经得到的从vi到vj且中间顶点序号不大于k-1的最短路径相比较,其长度较短者便是从vi到vj的中间顶点的序号不大于k的最短路径。这样,在经过n次比较后,最后求得的必是从vi到vj的最短路径。
按此方法,可以同时求得各对顶点间的最短路径。

代码如下:
Floyd

以上是关于图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)的主要内容,如果未能解决你的问题,请参考以下文章

经典树与图论(最小生成树、哈夫曼树、最短路径问题---Dijkstra算法)

图中基于点的两大算法总结

详解图(性质,结构,遍历,最小生成树,最短路径)

详解图(性质,结构,遍历,最小生成树,最短路径)

详解图(性质,结构,遍历,最小生成树,最短路径)

数据结构学习笔记——图的应用1(最小生成树最短路径)