Dijkstra演算法 C 實現

2021-08-18 18:58:23 字數 1232 閱讀 6759

對於圖g =(v,e),給定源點 s 屬於 v ,單源路徑是指從 s 到圖中其他各頂點的最短路徑.

下圖為帶權有向圖,從 v0 到其餘各個頂點的最短路徑如表所示。

源點終點

最短路徑

路徑長度

v0v1

v0->v1

12v2

v0->v2

10v3

v0->v4->v3

50v4

v0->v4

30v5

v0->v4->v3->v5

60設圖的鄰接矩陣為 w ,dijkstra 演算法首先將圖的頂點集合劃分成兩個集合 s 和 v-s 。

集合 s 表示最短路徑已經確定的頂點集合,其餘的頂點則存放在另乙個集合 v-s 中。

初始狀態時,集合 s 至包括源點,即 s = ,表示此時只有源點到自己的最短路徑稱為從源點到頂點 v 到最短路徑,並用陣列 d 來記錄當前所找到的從源點 s 到每個頂點的最短路徑長度,用陣列 path 來記錄到達各個頂點的前驅頂點。

其中,如果從源點 s 到頂點 c 有弧 ,則以弧到權值作為 d[v] 的初始值;否則將 d[v] 的初始為無窮大,path 陣列初始化為 s 。

dijkstra 演算法每次從尚未確定最短路徑長度的集合 v-s 中取出乙個最短特殊路徑長度最小的頂點 u ,將 u 加入集合 s ,同時更新陣列 d 、path 中由 s 可達大各個頂點的最短特殊路徑長度。

更新 d 的策略是,若加進 u 做中間頂點,使得 vi 的最短特殊路徑長度變短,則修改 vi 的最短特殊路徑長度及前驅頂點編號,即當 d[u]+w[u ,vi]

1.定義乙個結構體,用來記錄每個頂點的最短路徑。

struct path

};

2.dijkstra 演算法的實現

void dijkstra(int s,int  d)

mark[s] = visited;

d[s] = 0;

for(i = 0;id[j])

}mark[k] = visited;

for(edge e = firstedge(k);isedge(e);e = nextedge(e))}}

for(int i = 0;i

else

}

}

Dijkstra演算法C 實現總結

求無負權圖中點s到點t的最短凝聚力 標準說法中,縮短 鬆弛 relax 操作是對邊進行的。下面為了行文方便,將其拓展到點。即以下操作,其中a表示目前已經算出的點i到j的距離 a i j min a i v a v j a i j 同時維護path陣列 類似於按拓撲排序的順序,對所有點進行縮短操作。下...

dijkstra演算法實現

include include using namespace std const int maxnum 100 const int maxint 999999 各陣列都從下標1開始 int dist maxnum 表示當前點到源點的最短路徑長度 int prev maxnum 記錄當前點的前乙個結...

Dijkstra演算法 c語言實現

dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...