最短路徑 之Dijkstra演算法

2021-07-17 05:54:14 字數 4088 閱讀 9226

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

(int v =

0; v < n; v++)}

}}

//鄰接表

struct node

vector e[maxv]

;int n;

int dis[maxv]

, pre[maxv]

;// pre用來標註當前結點的前乙個結點

bool vis[maxv]=;

for(

int i =

0; i < n; i++

) pre[i]

= i;

//初始狀態設每個點的前驅為自身

void

dijkstra

(int s)}if

(u ==-1

)return

; visit[u]

=true

;for

(int j =

0; j < e[u]

.size()

; j++)}

}}

void

dfs(

int s,

int v)

dfs(s, pre[v]);

printf

("%d\n"

, v)

;}

for

(int v =

0; v < n; v++

)else

if(dis[u]

+ e[u]

[v]== dis[v]

&& c[u]

+ cost[u]

[v]< c[v])}

}

for

(int v =

0; v < n; v++

)else

if(dis[u]

+ e[u]

[v]== dis[v]

&& w[u]

+ weight[v]

> w[v])}

}

增加乙個陣列num,num[s] = 1,其餘num[u] = 0,表示從起點s到達頂點u的最短路徑的條數為num[u]

for

(int v =

0; v < n; v++

)else

if(dis[u]

+ e[u]

[v]== dis[v])}

}

for

(int v =

0; v < n; v++

)else

if(dis[u]

+ e[u]

[v]== dis[v])}

}}void

printpath

(int v)

printpath

(pre[v]);

printf

("%d "

, v)

;}

//dijkstra部分

if(dis[u]

+ e[u]

[v]< dis[v]

)else

if(dis[i]

+ e[u]

== dis[v]

)

int optvalue;

vector<

int> pre[maxv]

;vector<

int> path, temppath;

void

dfs(

int v)

temppath.

pop_back()

;return;}

temppath.

push_back

(v);

for(

int i =

0; i < pre[v]

.size()

; i++

)dfs

(pre[v]

[i])

; temppath.

pop_back()

;}

計算當前temppath邊權或者點權之和的**:

// 邊權之和

int value =0;

for(

int i = tempptah.

size()

-1; i >

0; i--

)// 點權之和

int value =0;

for(

int i = temppath.

size()

; i >=

0; i--

)

#include

#include

#include

using

namespace std;

int n, m, s, d;

int e[

510]

[510

], dis[

510]

, cost[

510]

[510];

vector<

int> pre[

510]

;bool visit[

510]

;const

int inf =

99999999

;vector<

int> path, temppath;

int mincost = inf;

void

dfs(

int v)

if(tempcost < mincost)

temppath.

pop_back()

;return;}

temppath.

push_back

(v);

for(

int i =

0; i < pre[v]

.size()

; i++

)dfs

(pre[v]

[i])

; temppath.

pop_back()

;}intmain()

pre[s]

.push_back

(s);

dis[s]=0

;for

(int i =

0; i < n; i++)}

if(u ==-1

)break

; visit[u]

=true

;for

(int v =

0; v < n; v++

)else

if(dis[v]

== dis[u]

+ e[u]

[v])}}

}dfs

(d);

for(

int i = path.

size()

-1; i >=

0; i--

)printf

("%d "

, path[i]);

printf

("%d %d"

, dis[d]

, mincost)

;return0;

}//注意路徑path因為是從末端一直壓入push_back到path裡面的,所以要輸出路徑的時候倒著輸出

最短路徑 之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...

最短路徑之Dijkstra演算法

這裡,我們想要得出節點a 節點1 到節點b 節點5 的最短路徑,就是怎麼走可以使得權重值的和最小,每一條邊都有乙個權重。今天我們介紹的d演算法就是解決這類問題的,這是一種貪心演算法,每次只取權重和最小的點,通過不斷加入節點,來更新源節點a到各個節點的最短路徑,直到所有節點遍歷完。演算法步驟 1 定義...