Dijkstra演算法與Floyd演算法

2021-10-03 15:44:47 字數 1884 閱讀 1717

給定一定無負值圈的圖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到這...