1、bellman-ford演算法
該演算法能解決單源最短路徑問題,即使存在負權邊的情況下。執行bellman-ford演算法可以返回乙個布林值,如果為true,則說明圖中不包含從源點可達的負權迴路,演算法將產生最短路徑及其權值;如果為false,則說明圖中包含從源點可達的負權迴路,該問題無解。
view code
1int 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
12、有向無環圖(dag)中得單源最短路徑//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 }
首先進行拓撲排序;
然後初始化d和p;
接著按照拓撲排序的順序遍歷每乙個頂點,對每乙個頂點的邊進行鬆弛操作。
3、dijkstra演算法
該演算法解決了有向圖上帶權的單源最短路徑問題,但要求所有的邊的權值非負。
首先自己實現最小優先佇列
priority queue
1struct 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)dijkstra演算法和廣度優先搜尋演算法和prim演算法有相似之處。dijkstra演算法和廣度優先搜尋演算法的相似之處在於,前者的集合s相當於後者的黑色頂點集合,正如集合s中的頂點有著最終的最短路徑權值,廣度優先搜尋中的黑色頂點也有著正確的廣度優先距離。dijkstra演算法與prim演算法的相似之處在於,兩種演算法均採用最小優先佇列,來找出給定集合以外「最輕」的頂點,然後把該點加入到集合中,並相應調整該集合以外剩餘頂點的權。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)
單源最短路徑
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...