最短路徑基礎演算法 弗洛伊德

2021-08-28 11:51:58 字數 2304 閱讀 8513

問題 a(1171): 【基礎演算法】最短路徑問題

時間限制: 1 sec 記憶體限制: 64 mb

題目描述

平面上有n個點(n<=100),每個點的座標均在-10000~10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的任務是找出從一點到另一點之間的最短路徑。

輸入

第1行:1個整數n

第2…n+1行:每行2個整數x和y,描述了乙個點的座標

第n+2行:1個整數m,表示圖中連線的數量

接下來有m行,每行2個整數i和j,表示第i個點和第j個點之間有連線

最後1行:2個整數s和t,分別表示源點和目標點

輸出

第1行:1個浮點數,表示從s到t的最短路徑長度,保留2位小數(如果到達不了,輸出極大值0x7f對應的double型別的值)

樣例輸入

copy (如果複製到控制台無換行,可以先貼上到文字編輯器,再複製)

5

0 02 0

2 20 2

3 15

1 21 3

1 42 5

3 51 5

樣例輸出

3.41
思路點拔:一道最短路的入門題,本題可以使用弗洛伊德演算法;下面我就詳細的推導一下弗洛伊德演算法

介紹

和dijkstra演算法一樣,弗洛伊德(floyd)演算法也是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一、2023年圖靈獎獲得者、史丹福大學電腦科學系教授羅伯特·弗洛伊德命名。基本思想 通過floyd計算圖g=(v,e)中各個頂點的最短路徑時,需要引入乙個矩陣s,矩陣s中的元素a[i][j]表示頂點i(第i個頂點)到頂點j(第j個頂點)的距離。 假設圖g中頂點個數為n,則需要對矩陣s進行n次更新。初始時,矩陣s中頂點a[i][j]的距離為頂點i到頂點j的權值;如果i和j不相鄰,則a[i][j]=∞。 接下來開始,對矩陣s進行n次更新。第1次更新時,如果"a[i][j]的距離" > 「a[i][0]+a[0][j]」(a[i][0]+a[0][j]表示"i與j之間經過第1個頂點的距離"),則更新a[i][j]為"a[i][0]+a[0][j]"。 同理,第k次更新時,如果"a[i][j]的距離" > 「a[i][k]+a[k][j]」,則更新a[i][j]為"a[i][k]+a[k][j]"。更新n次之後,操作完成! 單純的看上面的理論可能比較難以理解,下面通過例項來對該演算法進行說明。

例項分析

以上圖g4為例,來對弗洛伊德進行演算法演示。

初始狀態:s是記錄各個頂點間最短路徑的矩陣。 第1步:初始化s。 矩陣s中頂點a[i][j]的距離為頂點i到頂點j的權值;如果i和j不相鄰,則a[i][j]=∞。實際上,就是將圖的原始矩陣複製到s中。 注:a[i][j]表示矩陣s中頂點i(第i個頂點)到頂點j(第j個頂點)的距離。第2步:以頂點a(第1個頂點)為中介點,若a[i][j] > a[i][0]+a[0][j],則設定a[i][j]=a[i][0]+a[0][j]。 以頂點a[1]6,上一步操作之後,a[1][6]=∞;而將a作為中介點時,(b,a)=12,(a,g)=14,因此b和g之間的距離可以更新為26。同理,依次將頂點b,c,d,e,f,g作為中介點,並更新a[i][j]的大小。

**實現

#include#include#includeconst int maxn=105;

double jl(double a,double b,double c,double d) //兩點距離公式,注意座標是double

int main()

scanf("%d",&m);

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

scanf("%d %d",&p,&q);

for(int k=1;k<=n;k++) //fluyd演算法,注意,k必須是最外層迴圈 }}

}}printf("%.2lf\n",dis[p][q]); //輸出結果

return 0;

}

弗洛伊德演算法求最短路徑

include includeusing namespace std 鄰接矩陣的型別定義 define max 10000000 define max vertex num 20 typedef struct mgraph 構造有向網的鄰接矩陣 void createdn am mgraph g,i...

最短路徑 弗洛伊德 Floyd 演算法

弗洛伊德 floyd 演算法 是解決任意兩點間的最短路徑的一種演算法 floyd演算法是乙個經典的動態規劃演算法 用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的角度看問題,我們需要為這個目標重新做乙個詮釋 這個詮釋正是動態規劃最富創造力的精華所在 從任意節點i到任意...

最短路徑之弗洛伊德

floyd演算法是大二到大三期間集訓時候才算真正接觸的,或許只有前一段時間dp的積累現在才算是真正理解 這個演算法需要充分理解dp的滾動陣列思想才能算是真正的掌握 floyd演算法又稱為插點法 演算法的目標是要求圖中所有兩個點的最短距離,就用dis i j 來表示 但是dis i j 是不夠設定為狀...