求每一对顶点的最短路径。
枚举经每一个点中转其他的两点之间路径是否缩短,时间复杂度为o(n^3)。
核心代码如下:(map为存图的数组,无连接的更新为inf)
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f(Map[i][j]>Map[i][k]+Map[k][j])Map[i][j]=Map[i][k]+Map[k][j];
该算法可以处理负权,但无法处理负权回路。
错误写法:
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
if(Map[i][j]>Map[i][k]+Map[k][j])Map[i][j]=Map[i][k]+Map[k][j];
先枚举中转点会导致计算顺序的错误。
注意:赋初值是无穷大不要太大,否则两两相加会变成负数。