最近在練習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...