Dijkstra單元點最短路徑(不含負權)

2021-07-08 12:14:03 字數 1661 閱讀 5686

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

與bellman-ford不同的是,bellman-ford可處理含負權的圖,dijkstra不能處理含負權的圖。除此之外bellman-ford實質上是動態規劃,而dijkstra是貪心。且dijkstra快於bellman-ford。

為了求得最短路徑,迪傑斯特拉提出了一種按最短路徑長度遞增的次序逐次生成最短路徑的演算法,其特點是首先求出最短的一條路徑,然後再求長度次短的一條最短路徑,以此類推求出其他最短路徑。

設集合u存放以求得的最短路徑的端點,設源點為vs,在初始狀態下u=,然後每求得一次最短路徑,就將路徑上的端點加入到u中,再以新加入的點為前哨更新最短路徑記錄,如此依次迴圈。直到u=v時為止。

通俗地講,步驟為:

題目大意,有兩隻青蛙,分別在兩個石頭上,青蛙a想要到青蛙b那兒去,他可以直接跳到b的石頭上,也可以跳到其他石頭上,再從其他石頭跳到b那兒,求青蛙從a到b的所有路徑中最小的frog distance,我們定義frog distance為從a到b的一條路徑中所跳的最大距離,例如,如果從a到b某條路徑跳的距離是2,5,6,4,則frog distance就是6,題目輸入的第一行代表石頭的個數,當個數為0時結束程式,接著有n行,其中第2,3行分別代表a,b青蛙的座標,其他n-2行分別代表空的石頭的座標,輸出乙個小數(保留三位),具體格式參見樣例,注意每輸出乙個答案還要再空一行。

思路:

在前人的引導下用dijkstra解完這個題後發現其實更顯而易見的是用prim演算法來做這道題

對於用dijkstra來說,關鍵點在於理解:

定義 f(i,j)為i->j的路徑上的最大跳的最小值,那麼f(i,j)=min( f(i,j), max(f(i,k),f(k,j)) )。

對於prim來說,關鍵點在於:

找到最小生成樹之後查詢path路徑記錄,由終點往回追溯到起點,並在過程中記錄乙個最大值即可。(因為最小生成樹的原因可以保證此題找到的路徑中的最大值小於其他路徑中的最小值)

#include 

#include

using

namespace

std;

const

int maxstones = 200;

int input[maxstones][2];

double

map[maxstones][maxstones];

double dis[maxstones];

double dijkstra(int n);

int main(void)

}printf("scenario #%d\nfrog distance = %.3f\n\n", time++, dijkstra(n));

getchar();

}return0;}

double dijkstra(int n)

flag[0] = true;

for (i = 0; i < n-1; i++)

}flag[record] = true;

for (j = 0; j < n; j++)}}

return dis[1];

}

Dijkstra 最短路徑

dijkstra 最短路徑 針對有向圖,不支援負權值 圖的相鄰矩陣表示方法,還要用到最小值堆 include include define unvisited 0 define visited 1 define infinite 9999 設定最大值 define n 5 定義圖的頂點數 using...

dijkstra最短路徑

hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外n 1個地方,這些地方都能互相到達,且所有的邊都是有方向的。現在hehe要做的事就是去那些地方找回那n 1件禮物給xixi 由於每一件禮物都有特殊的意義,所以xixi要求hehe每找到一件禮物,就必...

最短路徑 Dijkstra

首先,提出兩點 一 如果把不帶權圖上的所有邊的權值均定義為1,則該不帶權圖可以歸結為帶權圖 二 如果把無向圖中的每一條邊 vi,vj 都定義為弧和弧,則該無向圖可以歸結為有向圖。因此不失一般性,我們只用看有向帶權圖怎麼求解最短路徑問題就ok。帶權圖中,從乙個結點到另個一結點存在著多條路徑,稱每一條路...