最短路径-迪杰斯特拉算法-弗洛伊德算法

最短路径:

网图是两顶点经过的边上权值之和最小的路径;非网图是两顶点之间经过的边数最少的路径

路径起点为源点,最后一个是终点


迪杰斯特拉算法:

1.将所有的顶点分为两部分:已知最短距离的顶点集合P和未知位置最短距离的顶点集合Q,一开始只有一个源点在P中

2.初始化distance数组,源点到其他顶点的距离没有直接连着的就算做inifinity,依据distance数组,在Q中选择距离源点最近的一个顶点u,放于P中,开始考察所有以u为起点的边,以u为中转点,检验能否减短源点到其他顶点的距离。如果有,更新distance数组。(松弛操作)

3.继续拿出距离u最近的一个顶点,重复

#如何判断是否减少距离:类似于最小生成树,需要遍历,一个个判断

 

弗洛伊德算法:

#所求为所有顶点到所有顶点的最短路径

核心思想:在两个顶点之间插入一个或多个中转点,比较经过与不经过中转点的距离哪个更短。

需要两个矩阵:邻接矩阵和中转点矩阵

核心代码:

for(k=0;kd[i][k]+d[k][j])//松弛操作  d[i][j]=d[i][k]+d[k][j]; 

#中转点矩阵P:P[i][j]=k从顶点i到顶点j的最短路径需要经过中转点k

你可能感兴趣的:(最短路径-迪杰斯特拉算法-弗洛伊德算法)