最短路徑dijkstra演算法及其優先佇列的優化

2021-09-11 15:53:28 字數 1659 閱讀 7668

最短路徑問題:對任意給出的圖g(v,e)和起點s,終點t,如何求從s到t的最短路徑。解決最短路徑問題的演算法有dijkstra演算法,bellman-ford演算法,spfa演算法和floyd演算法。

主要用於解決單源最短路徑問題,即給定圖g(v,e)和起點s,通過演算法得到s到達其他每個頂點的最短距離。

演算法步驟:設定集合s存放已被訪問的頂點,然後執行n次下面的每個步驟(n為頂點個數)

(1)每次從集合v-s(未被訪問的頂點)中選擇與起點s的最短距離最小的乙個頂點記為u,訪問並加入集合s

(2)之後,令頂點u為中介點,優化起點s與所有從u可以到達的頂點v之間的最短距離。

集合s可以用乙個布林型陣列來實現,當vis[i]==true時表示頂點vi已被訪問。

令int型陣列d表示從起點到任意頂點的最短距離,初始時給起點s的d[s]賦值為0,其餘為很大的值,可以用二進位制編碼的十六進製制0x3fffffff來表示inf,即不可到達。

dijkstra(g,d,s)}}

}

const int maxn=1000;

const int inf=0x3fffffff;

int n,g[maxn][maxn];

int d[maxn];

bool vis[maxn]=;

void dijkstra(int s)

;vectoradj[maxn];

int n;

int d[maxn];

bool vis[maxn]=;

void dijkstra(int s)

};vectoradj[maxv];

priority_queueq; //優先佇列

bool vis[maxv];

int dis[maxv];

int n,m,s; //點數,邊數和 起點下標

void dij(int s)

;const int maxv=1000; //最大頂點數

vectoradj[maxv]; //鄰接表

int dis[maxv]; //存放最短距離

int n,m,s; //頂點數,邊數,起點下標

bool vis[maxv]; //記錄是否還沒有被訪問

const int inf=0x3fffffff;

void dij(int s)

};vectoradj[maxv];

priority_queueq;

bool vis[maxv];

int dis[maxv];

int n,m,s; //點數,邊數和 起點下標

Dijkstra最短路徑演算法

基本思路是 選擇出發點相鄰的所有節點中,權最小的乙個,將它的路徑設定為確定。其他節點的路徑需要儲存起來。然後從剛剛確認的那個節點的相鄰節點,算得那些節點的路徑長。然後從所有未確定的節點中選擇乙個路徑最短的設定為確定。重複上面步驟即可。void dijkstra graph g,string v fl...

Dijkstra最短路徑演算法

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

最短路徑 Dijkstra演算法

最短路徑 描述 已知乙個城市的交通路線,經常要求從某一點出發到各地方的最短路徑。例如有如下交通圖 則從a出發到各點的最短路徑分別為 b 0c 10 d 50 e 30 f 60 輸入 輸入只有乙個用例,第一行包括若干個字元,分別表示各頂點的名稱,接下來是乙個非負的整數方陣,方陣維數等於頂點數,其中0...