最短路徑之Dijkstra演算法

2021-10-03 15:28:15 字數 1303 閱讀 2987

dijkstra演算法有些類似於最小生成樹中prim演算法,從源點出發,每次選出乙個最短路徑,然後依次更新n次。

下面是**實現

#include

#include

#include

using namespace std;

const

int maxv=

101;

const

int inf=

10000000

;struct node

;vectoradj[maxv]

;bool vis[

101]

;//標記

int dis[

101]

;//記錄最短距離

int pre[

101]

;//記錄路徑

//dijkstra演算法

void dijkstra (

int n)}if

(u==-1

)return

;//沒有找到

vis[u]

=true;

//標記已經找到的u

for(

int j=

0;j.size()

;j++

)//更新dis

//遇到一些問題此處可以加第二條件,比如邊權、點權、多少條最短路徑等 }}

}void

dfs(

int s,

int n)

dfs(s,pre[n]);

printf

("%d "

,n);

}int

main()

實際上,上面的程式只儲存了一條路徑,如果可能有多條路徑並要求都列印出來怎麼辦?

這時將pre變成vector型自然就可以存放多條路徑,然後在dfs裡面遞迴輸出即可。

那麼問題又來了,如果兩條路徑相同時,叫你選擇出花費最少、字典序最小、點權和最大等一些條件怎麼辦?

有兩個思路:

1.前面提到dfs裡面可以輸出多條路徑,不如在遍歷這些路徑的時候,記錄下符號其他條件的路徑,保持更新即可,這是dijkstra+dfs演算法的解決思路。

2.也可以直接在執行dijkstra過程中解決,其有乙個更新dis的操作,在更新這個操作的時候我們可以同時也更新花費、點權和等其他條件

前者具有通用性,特別是一定要輸出路徑時,推薦使用前者,如果只是要乙個值,後者比較簡潔,下面兩種方法的應用:

dijkstra+dfs+鄰接表:

dijkstra+鄰接矩陣+第二指標:

最短路徑 之Dijkstra演算法

dijkstra演算法dijkstra 鄰接矩陣 int n,e maxv maxv int dis maxv pre maxv pre用來標註當前結點的前乙個結點 bool vis maxv void dijkstra int s if u 1 return visit u true for in...

最短路徑 之Dijkstra演算法

dijkstra演算法 dijkstra 鄰接矩陣 int n,e maxv maxv int dis maxv pre maxv pre用來標註當前結點的前乙個結點 bool vis maxv void dijkstra int s if u 1 return visit u true for i...

最短路徑之Dijkstra演算法

using system namespace dijkstra演算法 路徑圖 static int places int math.sqrt map.length 獲取地點數 static int shortest new int places 存放從start到其他節點的最短路徑 static b...