給定一定無負值圈的圖g,頂點集為v,使用dijkstra演算法求出g中頂點n到頂點m的最短路徑,使用floyd演算法求出多源的最短路徑,具體的圖如下
dijkstra演算法又稱為單源最短路徑,所謂單源是在乙個有向圖中,從乙個頂點出發,求該頂點至所有可到達頂點的最短路徑問題。
#include
#include
#include
typedef
struct nodenode;
typedef
struct graphgraph;
typedef
struct edgeedge;
typedef
struct dijkstrapointdijkstrapoint;
graph init()
return mygraph;
}void
dijkstra
(graph g)
scanf
("%d"
,&start)
; dist[start]
.value =0;
while(1
)}if(min ==
999999999
)break
;else
dist[vmin]
.flag =1;
for(node* tmp = g.con[vmin]
.next; tmp !=
null
; tmp = tmp->next)}}
for(
int i=g.vertex-
1;i>=
0;i--
)printf
("%d\n"
,start);}
}}intmain()
floyd演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或有向圖或負權(但不可存在負權迴路)的最短路徑問題。
#include
#include
#define nums 12
typedef
struct
graph;
void
dispath
(int a[
][nums]
,int path[
][nums]
,int n)
;void
readgraph
(graph *g)
printf
("\n");
}}void
floyd
(graph g)
}for
(k=0
;k}}
dispath
(a,path,g.n);}
void
spath
(int path[
][nums]
,int i,
int j)
spath
(path,i,k)
;printf
("%d,"
,k +1)
;spath
(path,k,j);}
void
dispath
(int a[
][nums]
,int path[
][nums]
,int n)
}else}}
}int
main()
dijkstra:o(n^2),外迴圈while執行n次,每次內迴圈遍歷n次
floyd:o(n^3),三個迴圈均執行n次
Prim演算法 與 dijkstra演算法
有時總將兩者搞混,兩者都是基於貪心策略,且都是將圖中頂點劃分為兩部分,每次取最小值。在這裡對兩者的演算法做乙個區分。prim演算法是解決圖的 最小生成樹 問題,在每次迴圈中,選取乙個點在s中,另乙個點在v s中,且兩點權值最小,直到v s為空。dijkstra演算法是解決圖的 最短路徑 問題,即從某...
Dijkstra演算法與Prim演算法的異同
dijkstra演算法用於構建單源點的最短路徑樹 mst 即樹中某個點到任何其他點的距離都是最短的。例如,構建地圖應用時查詢自己的座標離某個地標的最短距離。可以用於有向圖,但是不能存在負權值 bellman ford可以處理負權值 dijkstra 選初始點r,q是無向圖g中所有點v的權值優先佇列,...
資料結構與演算法 Dijkstra演算法
dijkstra演算法用於圖中計算最小路徑,在路由選擇中也有用到。以乙個圖為例 演算法執行過程 1 選擇乙個起始點,並初始化其他各個點到起始點的開銷表d以及相對應的上乙個點 初始化時就是起點 2 找到開銷表d中的最小值,選擇這個開銷表的最小值所對應的點作為下乙個節點,記作 並更新其他未經過的點n到這...