1. 程式人生 > >cogs 1075. [省常中2011S4] 最短路徑問題

cogs 1075. [省常中2011S4] 最短路徑問題

保留 ++ 一行 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] 最短路徑問題