對於圖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演算法是很有代表性的最短...