多條最短路徑的求解

2021-06-28 03:10:07 字數 2048 閱讀 3559

最近在練習pat,遇到乙個要求解最短路徑的題,很自然地想起了這學期剛學的迪傑斯特拉演算法。但是這個問題要求解多條最短路徑,而迪傑斯特拉演算法只能求出其中一條最短路徑及其距離,所以要在運用迪傑斯特拉演算法演算法的基礎上,想想怎樣求解多條最短路徑。後來受到某個網友的啟發,想到了乙個解決辦法,演算法思想大概如下:

先運用迪傑斯特拉演算法求出源點到其它各點的最短路徑值,然後從終點開始往回走,設當前點

cur_v

初始化為終點,最短路徑點集

shortest_way初始化

,所有最短路徑集合

final_result_way初始化為空{}。

考察所有與cur_v相關聯的點,如果該點符合條件

dis[i]+arcs[i][cur_v] == dis[cur_v]

,則將該點儲存到shortest_way,並更新cur_v = i。如此往回推,直到cur_v為起點,則得出其中一條最短路徑,將集合short_way儲存到final_result_way。演算法結束後,final_result_way就是起點到終點所有最短路徑的集合。演算法實現如下:

/*

created by jk

15.01.09

//測試資料

//9個點,如圖所示

|---->2---| |--->8---|

| | | |

1---->3---5------>7---9

| | | |

|---->4---| |--->6---|

//圖用鄰接矩陣表示 其中1000000表示無窮大 在此演算法中 將點到自己的距離設為無窮大(否則會出錯)

91000000 1 1 1 1000000 1000000 1000000 1000000 1000000

1000000 1000000 1000000 1000000 1 1000000 1000000 1000000 1000000

1000000 1000000 1000000 1000000 1 1000000 1000000 1000000 1000000

1000000 1000000 1000000 1000000 1 1000000 1000000 1000000 1000000

1000000 1000000 1000000 1000000 1000000 1 1 1 1000000

1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1

1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1

1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1

1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000

*/#include #include #include #include using namespace std;

#define max 1000000

#define maxn 100

int n;

int arcs[maxn][maxn]; //鄰接矩陣

int d[maxn];//最短距離值

int final[maxn];//用於迪傑斯特拉演算法

stack< vector> shortest_way; //儲存其中一條最短路徑

stack< vector> final_result_way;//儲存所有最短路徑

void dij(int source) //迪傑斯特拉演算法

int cur_v;

for (int i = 1; i <= n; i++)

else}}

}while (!final_result_way.empty()) //輸出所以最短路徑

return 0;

}

Dijkstra演算法多條最短路徑下最短路徑的記錄

1.我們在使用dijkstra演算法求解源點到其餘頂點的最短路徑的時候,在大多數情況下最短路徑是只有一條的,但是也有可能存在著多條最短路徑的情況,所以之前使用整型的pre陣列來記錄當前節點的前驅節點的方法就不再適用這個問題了,所以需要另外的資料結構來進行記錄,而題目中告訴我們可能存在著多條最短的路徑...

頂點間最短路徑求解

include define infinity 100 表示 define max vertex num 20 最大頂點個數 typedef enum graphkind 圖的種類 typedef struct 鄰接矩陣 adjmatrix max vertex num max vertex num...

獲取多條最短路徑的Dijkstra演算法

dijkstra演算法是單源最短路徑經典演算法,一般用於所有邊的權為非負數的情況下,有向圖和無向圖均可。效率方面 儲存圖模型的資料結構有很多種,使用鄰接矩陣的話其空間複雜度都為o e 2 而如果是稀疏圖,使用鄰接鍊錶更划算,空間複雜度為o v e 在每次搜尋離起點最近的點方面,這裡用的還是vecto...