数据结构——最短路径算法之floyd算法
(一) Flody算法
【前言】:前面的Dijkstra算法用来解决单源最短路径的问题,即:从指定点到图上其他各点的最短路径。那么,如果我们要求图中任意两个结点之间的最短路径,如何用算法来实现呢?如果用Dijkstra来实现,就需要每次改变源点,再使用多个dis数组来记录,这样,问题就会变得很复杂。那么,有没有一种简单的算法来求图中任意两个结点之间的最短路径呢?当然有!那就是 Flody算法。
利用类似三角形定理:三角形的任意两边之和大于或等于第三边;
1.1 初始化
用邻接矩阵来存图,先进行初始化,自己到自己的距离初始化为0,到另外的顶点的距离初始化为无穷大。并将标记数组都置为0,表示所有顶点都未访问;
void init(){
for(int i=0;i<nodeNum;i++){
for(int j=0;j<nodeNum;j++){
if(i==j)
matrix[i][j]=0;
else
matrix[i][j]=INF;
}
}
}
【算法思想】:求A到B的最短路径,Flody算法的核心思想就是找到一个中转站C,使得从A到C再到B的距离比从A直接到B的距离短;
核心算法就是在N个结点中找到每次合适的一个中转站k:
floyd算法思想:
void flody(){
for(int i=0;i<nodeNum;i++){
//在n个结点中依次找中转站;
for(int j=i+1;j<nodeNum;j++){
for(int k=i;k<j;k++){
//如果直接从i到j的距离大于从i到k再到j的距离,
//即找到一个合适的中转站,就更新地图;
if(matrix[i][k]!=INF&&matrix[k][</