佛洛依德演算法求最短路徑(記錄路徑資訊)

2021-09-29 17:36:23 字數 2511 閱讀 9459

佛洛依德演算法:

利用d矩陣拿到鄰接矩陣中的權值。path矩陣記錄兩點之間的移動中轉點(初始值為起點)。

對於鄰接矩陣中 i 到 j 點的權值進行比較,若加上乙個中轉點 k 後的權值小於原本的權值,則對d[i][j]改為較小的d[i][k] + d[k]+[j]

而更新之後,路徑則是從i–j改為i–k--j,所以path[i][j] = path[k][j];

若要輸出 i到 j的路徑,要迴圈輸出path對應位置的值.

注意,當路徑變長時,path矩陣儲存的值需要倒序輸出才行,

舉個例子:

有五個點abcde ,對應座標分別為01234

其中頂點的連線關係為 a-b b-c c-d d-e a-e

由於三重迴圈先後順序的緣故,path[0][4]的中轉點為3

所以當頂點數量多時,個人認為需要倒序輸出path中記錄的路徑資訊

演算法**:

//圖中任意結點間最短路徑的演算法(佛洛依德演算法)

void

floyd

(graph g)

else path[i]

[j]=-1

;//否則記為-1

}for

(int k =

0; k

)for

(int i =

0;i

)for

(int j =

0; j < g.vexnum; j++)}

//此時已經算出了所有點之間的最短路徑,path記錄了點之間的路徑

}

應用在實際問題上:請為珠江三角洲城市間設計與實現乙個簡單的交通諮詢系統。

基本要求:

(1)設計簡單的珠江三角洲城市間道路通行平面圖 ,所含城市不少於10個。以圖中頂點表示城市節點,存放城市名稱、代號、簡介等資訊;以邊表示通行道路,存放道路的路徑長度。

(2)提供圖中任意城市的相關資訊查詢。

(3)提供圖中任意城市間的最短路徑查詢。

#include #include #define vexnum 10

#define maxuse 32767

using namespace std;

//圖的鄰接矩陣儲存結構

typedef struct graph graph;

/*找到a頂點在g中的位置*/

int locatevex(graph g, string a)

return -1;

}//建立圖的資訊

int createjz(graph &g)

//初始化鄰接矩陣

for (int i = 0; i < g.vexnum; i++)

} //輸入邊的資訊

cout << "分別輸入兩點及其之間邊的資訊:" << endl;

for (int k = 0; k < g.arcnum; k++)

g.arcs[i][j] = use;

g.arcs[j][i] = g.arcs[i][j];

} return 1;

}//查詢兩點距離資訊

int distance(graph g, string a, string b)

return g.arcs[i][j];

}//查詢於該地點可連線的地點及其距離

void check(graph g, string a)

}//此時已經算出了所有點之間的最短路徑

//匹配a,b在圖中的節點的位置

int a_index = locatevex(g, a);

int b_index = locatevex(g, b);

if(d[a_index][b_index] != maxuse)

cout << a << "到" << b << "的最短路徑長度為" << d[a_index][b_index] << endl;

else cout << "無最短路徑" << endl;

//迴圈輸出path中所經路徑的節點

int index = b_index;

int i = 0;

cout << "所經城市為" << a << "--";

while (a_index != path[a_index][index])

//倒序輸出地點

for (i--; i >= 0; i--)

cout << b << endl;

}int main()

}}

求最短路徑

從源點到終點的路徑可能存在三種情況 1.沒有路徑 2.只有一條路徑 3.有多條路徑 思路 按照路徑長度遞增的次序從源點到終點的路徑。假設gra ph graph graph 為有向網的鄰接矩陣,s ss為已找到最短路徑結點的集合,其初始狀態為只含乙個頂點,即源點。另設乙個一維陣列dis t n di...

Dijkstra演算法求最短路徑

參考文獻 dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用open,close表方式,drew為了和下面要介紹的 a 演算法和 d 演算法表述一致,這裡均採用open,close表的方式。大概過程 建立兩個表,open,close。open表儲存所有已生成而未考察的節點,...

Dijkstra演算法求最短路徑

dijkstra演算法用來求最短距離 已經實現了 那麼最短路徑 如何求解並列印出來呢?此處的方法是記錄路徑中結點的前驅 if v未被訪問 以u為中介點可以使起點s到頂點v的最短距離d v 更優 程式具體實現,鄰接矩陣版 n為頂點數,maxv為最大頂點數 int n,g maxv maxv 起點到達各...