算法核心:
for(k=1;k<=n;k++) //在允许通过一个顶点中转的情况下
for(i=1;i<=n;i++) //遍历此图,看任意两点之间经过该周转能否减少距离
for(j=1;j<=n;j++)
if(e[i][k] < inf && e[k][j] < inf && e[i][j] > e[i][k]+e[k][j]) //inf为正无穷,表示不可通行
e[i][j]=e[i][k]+e[k][j];
问题描述:有五个城市,城市之间的公路不一定互通,其公路图如下图,现求任意两个城市的最短路程
代码实现
#include<stdio.h>
int main()
{
int e[10][10],k,i,j,n,m,t1,t2,t3;
int inf=99999999;//一般将正无穷定义以为99999999,这样即使两个正无穷相加,其和仍然不超过int类型
scanf("%d %d",&n,&m);//n表示有几座城市,m表示n座城市间共有多少条路
//初始化
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j) e[i][j]=0;
else e[i][j]=inf;
for(i=1;i<=m;i++){
scanf("%d %d %d",&t1,&t2,&t3);;
e[t1][t2]=t3;
}
//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];
//输出
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("%3d",e[i][j]);
}
printf("\n");
}
return 0;
}
输入:
4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12
输出:
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0