最短路徑問題的複習整理(2)

2021-10-20 10:31:51 字數 1425 閱讀 1217

最短路徑問題的複習整理(1)

最短路徑問題的複習整理–優化篇

對最短路徑問題(1)的補充

相對於迪傑斯特拉演算法,它在沒有負圈的情況最多更新v-1次,因此它適用於存在負邊的情況,並且可以判斷是否存在負圈(判斷是否更新了v次以上)。

**實現:

//貝爾曼福德演算法 o(ve) 適用於負邊 

//下面例子是對dag進行操作

#include

#include

#include

#define max_v 100

#define max_e 100

#define inf 0x3f3f3f3f

using

namespace std;

struct edge

;int d[max_v]

;edge es[max_e]

;//dag,無需構成鄰接矩陣或鄰接表,直接寫入邊即可

int v, e;

void

shortest_path

(int s)}if

(!flag)

break;}

}int

main()

對迪傑斯特拉演算法進行堆優化

要點:利用優先佇列,在更新最短距離時,把對應元素往根的方向移動以滿足堆的性質

每次push都會push到適當的位置,保持堆的穩定,「排序為從小到大」,下次取時總會取出min

#include

#include

#include

#include

#include

#define max_v 100

#define inf 0x3f3f3f3f

using

namespace std;

struct edge

;typedef pair<

int,

int> p;

//first為最短距離,second是頂點編號

int v, e;

//鄰接表的vector表示法

vector g[max_v]

;int d[max_v]

;//d[i] 表示從 頂點s 到 頂點i 的最短距離

void

shortest_path

(int s)}}

}int

main()

shortest_path(0

);for(

int i =

0; i < v; i++

) cout << d[i]

<<

" ";

return0;

}

最短路徑問題的複習整理(1)

最短路徑問題的複習整理 2 最短路徑問題的複習整理 優化篇 問題簡述 求從v0出發經過乙個無向網到各個頂點的最短路徑及相應權的大小 我們最常用的還是迪傑斯特拉演算法 基本實現思路 1 就是先找出和當前頂點直接連通的頂點,記錄邊上相應權到陣列d,達不到的記為inf 2 繼續對相應權最小的邊上的那個頂點...

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

Codeup最短路徑 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...