題目:
一個圓點代表一個城市,帶箭頭的線表示路徑方向(只能單方向走),線上的數字表示該路徑的長度。
代碼:
#include <stdio.h>
int main()
{
int e[10][10],k,i,j,n,m,t1,t2,t3;
int inf=9999; //代指無窮大(因爲題目中的點和路徑很少,就解題而言9999就已經足夠大了)
scanf("%d %d",&n,&m);//有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][k]<inf && e[k][j]<inf && e[i][j]>e[i][k]+e[k][j])
{
e[i][j]=e[i][k]+e[k][j];//更新i點到j點的最短路徑
}
}
}
}
//結果輸出
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
printf("%10d",e[i][j]);
}
printf("\n");
}
return 0;
}
測試數據:
測試結果: