最短路徑演算法 Dijkstra演算法的實質與變體

2021-07-30 16:56:00 字數 3159 閱讀 3333

dj演算法:求有向網g的v0頂點到其餘頂點v最短路徑p[v]及帶權長度d[v]

dj演算法思想:

1.對權值的深刻抽象,不一定要是路徑,可能是一種權值相關的函式。參加題2

2.每次尋找最近v0的點時,不是尋找它的相鄰點,而是已經求出距離的那些點,這裡容易求相鄰點而造成失誤。

1 用於儲存最短路徑下標的陣列

2 用於儲存到各點最短路徑的權值和。

3 用於標記是否已經獲得v0至v的最短路徑。

首先說明兩種情況:

1 路徑上有權值,這種是普遍情況,直接用節點v與節點0之間的路徑值作為最短路徑一維陣列的初始值。

2 路端節點上有權值,路徑相等,這種情況是dj演算法的變體,實質也是dj演算法。

原來是要到醋溜站台乘坐醋溜快車到醋溜港」,亮亮解出了地圖隱藏的秘密,趕緊奔向醋溜站台,但到了之後,亮亮憂桑地發現,從醋溜站台到醋溜港沿途的每個車站都有很多美女被他颯爽的英姿所吸引,只要經過車站就會被這些漂亮的女孩搭訕,但是現在亮亮一心想要尋找楚楚街而沒空去搭理她們,所以亮亮希望在抵達醋溜港的時候被搭訕的次數最少。問亮亮抵達醋溜港最少會被搭訕多少次?

輸入描述:

第一行包含兩個整數n(2<=n<=5000),m(1<=m<=50000)。n表示公有n個汽車站,m表示公有m條公路,起點為1,終點為n。

第二行包含n個整數(0<=k<=10000),第i個整數表示在第i站有k個美女想要搭訕亮亮。

接下來m行,每行包含兩個整數p(1<=p<=n),q(1<=q<=n),代表p,q兩個站是有班車直達的。

輸出描述:

乙個整數,即亮亮抵達醋溜港最少需要被搭訕的次數。
輸入例子:

5 5

0 1 1 3 6

1 21 4

2 33 5

4 5

輸出例子:

8

#include #include #include using namespace std;

int main()

for (int i = 1; i <= m; ++i)

vectorpathmatrix(n+1);

vectorshortpathtable(n+1);

vectorfinal(n+1);

for (int v = 1; v <= n; ++v)

shortpathtable[1]=girls[1];

final[1]=1;

for (int v = 2; v <= n; ++v)

for (int i = 1; i <= end; ++i)

}}int main()

for (int i = 1; i <= m; ++i)

int mintalks = 100000;

visited[1] = 1;

dfs(1, n, girl[1], &mintalks);

cout << mintalks << endl;

}return 0;

}

輸入描述:

一行包含兩個整數n(2<=n<=500),m(1<=m<=2000),用單個空格隔開。表示公有n個港,m條航線。起點為1,終點為n。

接下來m行,每行包含五個整數p,q(1<=p,q<=n), k(1<=k<=1000), x,y(0<=x,y<=10000),代表p,q兩個港有航線並需要k天,並且該航線在第x天到第y天天氣惡劣不可通行。

輸出描述:

乙個整數,即亮亮最快能在第幾天抵達楚楚街港
輸入例子:

4 4

2 1 1 7 13

4 3 2 10 11

1 3 8 9 12

2 3 3 2 10

輸出例子:

14
#include #include #include using namespace std;

#define max 501

struct cost

;int arrivetime(int start,int k,int x,int y)

cost matrix[max][max];

int earlist[max];

int ffinal[max];

int main()

}for (int i = 1; i <= m; ++i)

for (int v = 1; v <= n; ++v)

else

earlist[v]=int_max;

}earlist[1]=0;

ffinal[1]=1;

for (int v = 2; v <= n; ++v)

{int min=int_max;

int p;

for (int w = 1; w <=n ; ++w)//說明我沒有深刻理解dj演算法的精髓,每次尋找最近的點時,不是尋找它的相鄰點,而是所有已經求出來的點,到v0的距離綜合起來最近的。

{ /*這裡在尋找最近點時,不是尋找相鄰點,那樣就只有有限個了。sb

if(!final[w]&&matrix[1][w].k!=int_max){這裡只是每次判斷了相鄰點,但是最近點不一定是相鄰點!!!所以針對的是earliest

int arrive=arrivetime(earlist[1],matrix[1][w].k,matrix[1][w].x,matrix[1][w].y);

if(arrive

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...