平面上有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...