275 最短路徑問題 Floyd

2021-08-22 04:27:41 字數 1384 閱讀 9423

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

輸入檔案共n+m+3行,其中:第一行為整數n。

第2行到第n+1行(共n行) ,每行兩個整數x和y,描述了乙個點的座標。

第n+2行為乙個整數m,表示圖中連線的個數。

此後的m 行,每行描述一條連線,由兩個整數i和j組成,表示第i個點和第j個點之間有連線。

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

輸出檔案僅一行,乙個實數(保留5位小數),表示從s到t的最短路徑長度。

5

0 02 0

2 20 2

3 15

1 2

1 3

1 4

2 5

3 5

1 5

3.41421
n<=100

本題為單源最短路的模板,使用的是最簡單的(也是最偷懶的)floyd:

floyd演算法基於動態規劃的思想, 從任意節點i到任意節點j的最短路徑不外乎2種可能,1是直接從i到j,2是從i經過若干個節點k到j。所以,我們假設dis(i,j)為節點u到節點v的最短路徑的距離,對於每乙個節點k,我們檢查dis(i,k) + dis(k,j) < dis(i,j)是否成立,如果成立,證明從i到k再到j的路徑比i直接到j的路徑短,我們便設定dis(i,j) = dis(i,k) + dis(k,j),這樣一來,當我們遍歷完所有節點k,dis(i,j)中記錄的便是i到j的最短路徑的距離。

所以,以上可以總結為:

code:

#include#include#include#include#includeusing namespace std;

const int n=105;

int s,t;//最終求的兩個點的編號

double dis[n][n];//distance,該陣列儲存的是兩點之間的距離

int read()

c=getchar();

} while(c>='0'&&c<='9')

return ans*f;

}struct node

a[n];

int main()

m=read();

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

s=read();

t=read();

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

}} printf("%.5f\n",dis[s][t]);//小數點後5位的精度

return 0;

}

275 最短路徑問題

275.最短路徑問題 描述 提交自定義測試 題目描述 平面上有n個點,每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的任務是找出從一點到另一點之間的最短路徑。輸入描述 輸入檔案共n m ...

275 水題 最短路徑問題

最短路徑問題 非常水的一道題啦,但是對於相隔九個月重新出山第一天的我非常不友好,各種小錯誤容易犯啊!一遍floyd加上簡單的座標求距離公式。幾乎是模板題 題目 平面上有n個點,每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路...

UOJ 275 最短路徑問題

題目描述 平面上有n個點,每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的任務是找出從一點到另一點之間的最短路徑。輸入描述 輸入檔案共n m 3行,其中 第一行為整數n。第2行到第n 1...