Floyd-Warshall算法:求任意两点之间的最短距离
问题描述:
——小哼准备去一些城市去旅游。为了节省经费以及方便旅程,小哼希望在出发之前知道任意两个城市之间的最短路程。
算法原理:
——动态规划思想,代码越看越迷。
——大概思想:若使顶点 i 到顶点 j 的距离缩短,必须引入第三个顶点 k 进行中转才有,一旦缩短,立刻更新 e [ i ] [ j ](直接距离),中转点可能需要多个,但存在更新保存,相当于不断的寻找第三个顶点 k 。
直接距离: i - > j
间接距离: i - > k - > j,一旦更新,就变为直接距离,其实不存在间接距离。
——如果理解了任意两点最短路径,该算法才可以算被真正理解。
时间复杂度:
——(n ^ 3),该算法只与顶点有关系,与边无关系。
特点:
——可解决含有负权边(边值为负数)图,图中可以存在环,但该环内所有边权值之和不能为负数。
——利用矩阵存图,无法使用邻接表。
Floyd-Warshall代码
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
//e[i][j]需要提前存储信息,不可直接到达为距离为无穷大