众所周知,floyd的代码如下:
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
其中i和j为图上点。
那么,将j循环去掉,便可得单源最短路:
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
dis[strat][i]=min(dis[strat][i],dis[start][k]+dis[k][i]);
理论上复杂度O(N2),相当于dij不加堆优化,但是其实这个floyd改没啥实用性......(空间复杂度O(N2),其他两种空间都只有O(M))