1. 程式人生 > >POJ - 2253 Frogger(Floyd最短路+預處理)

POJ - 2253 Frogger(Floyd最短路+預處理)

最短路 pri str 之間 col ace blank scanf oid

題目鏈接:http://poj.org/problem?id=2253

題意:青蛙要從點1到點2,給出各點的坐標,如果點A到點B可以通過A->C,C->B,A到B的距離可以用A->C和C-B中較長的一邊代替(如果A直接到B更短的話就不用了),求點1到點2的最短距離。

題解:本來想用dijkst,但是想想就200的數據量,直接Floyd豈不美滋滋。先預處理一下各點之間的距離。因為取兩條邊中較長的那條邊,所以轉移的話,那轉移的兩條邊都要比原來的短才可以。

值得註意的是用C的格式輸入的時候要用%lf,輸出的時候用%f,這個是書上的一個小細節,忘了具體的原理了。(逃...

狀態轉移方程:dp[i][j]=max(dp[i][k],dp[k][j])

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int n,cas=1;
 7 double dp[222][222];
 8 struct point{
 9     double x;
10     double y;
11 }P[222];
12 
13 double fun(point a,point b){
14     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
15 } 16 17 void Floyd(){ 18 for(int k=1;k<=n;k++) 19 for(int i=1;i<=n;i++) 20 for(int j=1;j<=n;j++) 21 if(dp[i][j]>dp[i][k]&&dp[i][j]>dp[k][j]) 22 dp[i][j]=max(dp[i][k],dp[k][j]); 23 } 24 25 int main(){ 26 while(scanf("%d",&n)!=EOF&&n){
27 for(int i=1;i<=n;i++) scanf("%lf %lf",&P[i].x,&P[i].y); 28 for(int i=1;i<=n;i++) 29 for(int j=1;j<=n;j++) 30 dp[i][j]=fun(P[i],P[j]); 31 Floyd(); 32 printf("Scenario #%d\nFrog Distance = %.3f\n\n",cas++,dp[1][2]); 33 } 34 return 0; 35 }

POJ - 2253 Frogger(Floyd最短路+預處理)