單源最短路徑

2022-07-31 06:00:22 字數 2312 閱讀 1694

1、bellman-ford演算法

該演算法能解決單源最短路徑問題,即使存在負權邊的情況下。執行bellman-ford演算法可以返回乙個布林值,如果為true,則說明圖中不包含從源點可達的負權迴路,演算法將產生最短路徑及其權值;如果為false,則說明圖中包含從源點可達的負權迴路,該問題無解。

view code

1

int d[50];

2int p[50];34

//initialize each distance of vertex to source, first source can't be reached5//

p is the parent of vertex

6void init_singlesource(const graph* g,int source)

7 13 d[source-1]=0;

14 }

1516

//one step of relaxation

17void relaxation(int u,int v,int w)

18 24 }

bellman-ford

1

//first we initialize d & p,then we do relaxation on every edges, all |v|-1 times2//

last we check whether there is negative-weight circuit in the graph

3bool bellman_ford(const graph* g)

4 15 }

1617

for(int i=0;iedge_num;++i)

18

25return

true;

26 }

2、有向無環圖(dag)中得單源最短路徑

首先進行拓撲排序;

然後初始化d和p;

接著按照拓撲排序的順序遍歷每乙個頂點,對每乙個頂點的邊進行鬆弛操作。

3、dijkstra演算法

該演算法解決了有向圖上帶權的單源最短路徑問題,但要求所有的邊的權值非負。

首先自己實現最小優先佇列

priority queue

1

struct dijinfo

2 ;6

7 dijinfo info[50];89

void maintain_heap(dijinfo* arr,int i,int n)

10 36 }

37 }

3839

void build_heap(dijinfo* arr,int n)

40 45

46void sort_heap(dijinfo* arr,int n)

47 59 }

dijkstra

1

void init_dijinfo(const graph* g)

2 8 }910

int search_info(int m,int n)

11 17

18void relaxation_dij(int u,int v,int w,const graph* g)

19 27

28void dijkstra(const graph* g)

29 44 }

45 }

再給出一下偽**

dijkstra

1 dijkstra(g,w,s)

2 initialize-single-source(g,s)

3 s=null

4 q=v(g)

5while(!q.empty())

6 u=extract-min(q)

7 s=s u

8for each vertex v which is ajacent vertex of u

9 relax(u,v,w)

dijkstra演算法和廣度優先搜尋演算法和prim演算法有相似之處。dijkstra演算法和廣度優先搜尋演算法的相似之處在於,前者的集合s相當於後者的黑色頂點集合,正如集合s中的頂點有著最終的最短路徑權值,廣度優先搜尋中的黑色頂點也有著正確的廣度優先距離。dijkstra演算法與prim演算法的相似之處在於,兩種演算法均採用最小優先佇列,來找出給定集合以外「最輕」的頂點,然後把該點加入到集合中,並相應調整該集合以外剩餘頂點的權。

單源最短路徑

include define max 999 define maxverts 10 typedef struct graph void chushi graph g void dij graph int key,int int int main for i 1 i g.numverts i dij ...

單源最短路徑

最優子結構 最短路徑的子路徑也是最短路徑,動態規劃和貪心演算法的乙個重要指標。環路 一條最短路徑不可能包含環路 1 環路權重為負,如果有一條環路權重為負,則不存在最短路徑 2 環路權重為零,如果包含該環路,則將該環路去掉即可 3 環路權重為正,去掉改環路可以得到更短的路徑,因此不可能是最短路徑 最短...

單源最短路徑

單源最短路徑問題,即在圖中求出給定頂點到其他任一頂點的最短路徑。1.最短路徑的最優子結構性質 該性質描述為 如果p i,j 是從頂點i到j的最短路徑,k和s是這條路徑上的乙個中間頂點,那麼p k,s 必定是從k到s的最短路徑。證明 假設p i,j 是從頂點i到j的最短路徑,則有p i,j p i,k...