設計並實現一個交通資訊系統。能夠讓旅客諮詢從任何一個城市頂點到另一個城市頂點之間的最短路徑問題。
要求:能夠輸出旅客所走路徑
作者:何知令
完成時間:2016年6月25日
解題思想:
使用弗洛伊德算法依次遍歷圖中每個頂點,考量將其加入到圖中任意兩個頂點之間是否會使該兩個頂點之間的路徑(當前)剪短,若是,則在path[i][j]中記錄下該頂點。依次迭代就可以得到圖中任意兩頂點之間的最短路徑
難點:難點在於怎樣理解該算法只在兩頂點之間插如一個頂點但實現了長路徑的求解,以及用於存儲路徑頂點和往前遞歸尋找路徑頂點的過程
代碼:
/*
問題描述:數據結構上機實驗報告題5:
設計並實現一個交通資訊系統。能夠讓旅客諮詢從任何一個城市頂點到另一個城市頂點之間的最短路徑問題。
要求:能夠輸出旅客所走路徑
作者:何知令
完成時間:2016年6月25日
*/
#include <stdio.h>
#define INF 32767 //INF表示∞
int a,b;//起點和終點
int path[7][7];//用於存放路徑
int A[7][7]=//每個城市到另一個城市的路徑,-1表示該城市到另一城市沒有直接路徑或者到自身
{
{0,4,6,6,INF,INF,INF},
{4,0,1,INF,7,INF,INF},
{6,1,0,2,6,4,INF},
{6,INF,2,0,INF,5,INF},
{INF,7,6,INF,0,1,6},
{INF,INF,4,5,1,0,8},
{INF,INF,INF,INF,6,8,0}
};
void Ppath(int i,int j) //前向遞歸查找路徑上的頂點
{
int k;
k=path[i][j];
if (k==-1) return; //找到了起點則返回
Ppath(i,k); //找頂點i的前一個頂點k
printf("%d,",k);
Ppath(k,j); //找頂點k的前一個頂點j
}
void Floyd()
{
int i,j,k;
for (i=0; i<7; i++)
for (j=0; j<7; j++)
path[i][j]=-1;
for (k=0; k<7; k++)
{
for (i=0; i<7; i++)
for (j=0; j<7; j++)
if (A[i][j]>A[i][k]+A[k][j])
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
}
int main()
{
int i,j;
printf("下爲一個城市的交通圖(領接矩陣形式):\n");
for(i=0; i<7; i++)
{
for(j=0; j<7; j++)
{
if(A[i][j]==INF)
printf("\tINF\t");
else
printf("\t%d\t",A[i][j]);
if(j==6)
printf("\n");
}
}
printf("請輸入起點和終點:\n");
scanf("%d %d",&a,&b);
Floyd();
printf("從城市%d到城市%d的路徑長度:%d 路徑爲:",a,b,A[a][b]);
printf("%d,",a); //輸出路徑上的起點
Ppath(a,b); //輸出路徑上的中間點
printf("%d\n",b); //輸出路徑上的終點
return 0;
}
程序運行結果展示:
知識點總結:弗洛伊德算法及圖的鄰接矩陣
學習心得:開始怎麼讀都讀不懂,後來還是老老實實在紙上寫寫,仔細想了想迭代的過程和具體實現長路徑距離的尋找過程,才明白這個算法是怎麼回事