cogs 1075. [省常中2011S4] 最短路徑問題
阿新 • • 發佈:2017-05-17
保留 ++ 一行 main 個數 長度 現在 stdout pre
1075. [省常中2011S4] 最短路徑問題
★ 輸入文件:short.in
輸出文件:short.out
簡單對比
時間限制:1 s
內存限制:128 MB
[問題描述]
平面上有n個點(n<=100),每個點的坐標均在-10000~10000之間。其中的一些點之間有連線。若有連線,則表示可從一個點到達另一個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的任務是找出從一點到另一點之間的最短路徑。
[輸入格式]
輸入文件為short.in,共n+m+3行,其中:
第一行為整數n。
第2行到第n+1行(共n行),每行兩個整數x和y,描述了一個點的坐標。
第n+2行為一個整數m,表示圖中連線的個數。
此後的m行,每行描述一條連線,由兩個整數i和j組成,表示第i個點和第j個點之間有連線。
最後一行:兩個整數s和t,分別表示源點和目標點。
[輸出格式]
輸出文件為short.out,僅一行,一個實數(保留兩位小數),表示從s到t的最短路徑長度。
[樣例輸入]
5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5
[樣例輸出]
3.41
floyd怒過
#include<cmath> #include<cstdio> #include<iostream> using namespace std; int n,s,t,m; int a[1000],b[1000]; float g[1000][1000]; int main() { freopen("short.in","r",stdin); freopen("short.out","w",stdout); cin>>n;for (int i=1;i<=n;++i) { int x,y; cin>>x>>y; a[i]=x; b[i]=y; } for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) g[i][j]=100000000; cin>>m; for(int i=1;i<=m;++i) { int x,y; cin>>x>>y; g[x][y]=g[y][x]=sqrt((a[x]-a[y])*(a[x]-a[y])+(b[x]-b[y])*(b[x]-b[y])); } cin>>s>>t; for(int k=1;k<=n;++k) for(int i=1;i<=n;++i) if(i!=k) for(int j=1;j<=n;++j) if(g[i][k]+g[k][j]<g[i][j]) g[i][j]=g[i][k]+g[k][j]; printf("%.2f",g[s][t]); return 0; }
cogs 1075. [省常中2011S4] 最短路徑問題