最短路径:
网图是两顶点经过的边上权值之和最小的路径;非网图是两顶点之间经过的边数最少的路径
路径起点为源点,最后一个是终点
迪杰斯特拉算法:
1.将所有的顶点分为两部分:已知最短距离的顶点集合P和未知位置最短距离的顶点集合Q,一开始只有一个源点在P中
2.初始化distance数组,源点到其他顶点的距离没有直接连着的就算做inifinity,依据distance数组,在Q中选择距离源点最近的一个顶点u,放于P中,开始考察所有以u为起点的边,以u为中转点,检验能否减短源点到其他顶点的距离。如果有,更新distance数组。(松弛操作)
3.继续拿出距离u最近的一个顶点,重复
#如何判断是否减少距离:类似于最小生成树,需要遍历,一个个判断
弗洛伊德算法:
#所求为所有顶点到所有顶点的最短路径
核心思想:在两个顶点之间插入一个或多个中转点,比较经过与不经过中转点的距离哪个更短。
需要两个矩阵:邻接矩阵和中转点矩阵
核心代码:
for(k=0;k<n;k++)//中转站0-k for(i=0;i<n;i++) //i为起点 for(j=0;j<n;j++) //j为终点 if(d[i][j]>d[i][k]+d[k][j])//松弛操作 d[i][j]=d[i][k]+d[k][j];
#中转点矩阵P:P[i][j]=k从顶点i到顶点j的最短路径需要经过中转点k