暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。
现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储。比如1号城市到2号城市的路程为2,则设e[1][2]的值为2。2号城市无法到达4号城市,则设置e[2][4]的值为∞。另外此处约定一个城市自己是到自己的也是0,例如e[1][1]为0,具体如下:
代码:
#include
<stdio.h>
int
main()
{
int
e[10][10],k,i,j,n,m,t1,t2,t3;
int
inf=99999999;
//用inf(infinity的缩写)存储一个我们认为的正无穷值
//读入n和m,n表示顶点个数,m表示边的条数
scanf
(
"%d
%d"
,&n,&m);
//初始化
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
(
"%10d"
,e[i][j]);
}
printf
(
"
"
);
}
return
0;
}
1
2
3
4
5
6
|
//Floyd-Warshall算法核心语句 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]) e[i][j]=e[i][k]+e[k][j]; |
1
2
3
4
5
6
7
8
9
|
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 |
结果: