Floyd-Warshall—只有五行的算法
Floyd-Warshall 适合用于多元最短路径,及任意两点间的最短距离
基本思想:通过途径其他顶点来缩短两点之间的距离
其时间复杂度为n^3
题目:
给定若干个城市和若干个道路,求任意两个城市之间的最短距离
第一行为 n(城市数量),m (道路数量),接下来 m 行,每行为城市 a,城市 b,它们之间的距离。
输入样例:
4 8
0 1 2
0 2 6
0 3 4
1 2 3
2 0 7
2 3 1
3 0 5
3 2 12
输出样例:
利用矩阵来表示两城市之间的最短距离
例如第一行的2表示城市0到城市1的最短距离为2
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0
C代码:
#include <stdio.h>
#define INF 99999999
int main()
{
int map[50][50];
int n,m,index1,index2,lenth,i,j,k;
scanf ("%d%d",&n,&m);
for (i=0;i<n;i++)//初始化
{
for (j=0;j<n;j++)
{
if (i==j)
map[i][j]=0;
else
map[i][j]=INF;
}
}
for (i=0;i<m;i++)
{
scanf ("%d%d%d",&index1,&index2,&lenth);
map[index1][index2]=lenth;
// map[index2][index1]=lenth;//无向图
}
for (k=0;k<n;k++)//Floyd-Warshall
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
printf ("\n");//输出
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
printf ("%d ",map[i][j]);
printf ("\n");
}
return 0;
}