算法分析与设计
最短路 Floyd算法
问题描述:
给出一张带权的的图,边的权值可以理解为两点之间的距离。一张图中任意两点间会有不同的路径相连。最短路就是指连接两点的这些路径中最短的一条。
算法思路:
Floyd:
一个有n个点,每次选取一个点k做为中间点,更新其他点的距离,即dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]).当每个点都作为中间点更新过所有的边时,所有的路劲距离皆为最短路劲。
以上图为例,当2为中间点时,dis[1][3]=dis[1][2]+dis[2][3]=5<dis[1][3]=6.其他点为中间点时同理。
。
核心伪代码:
void Floyd(){
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(mp[i][j]>mp[i][k]+mp[k][j])
mp[i][j]=mp[i][k]+mp[k][j];
}
时间复杂度:
Floyd三重for,O(n^3)。
源码:
github:https://github.com/SpiritDemon-max/myText/blob/master/Floyd.cpp