POJ - 2253 Frogger(Floyd最短路+预处理)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ - 2253 Frogger(Floyd最短路+预处理)相关的知识,希望对你有一定的参考价值。

题目链接: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最短路+预处理)的主要内容,如果未能解决你的问题,请参考以下文章

poj 2253 Frogger(floyd变形)

floyd类型题UVa-10099-The Tourist Guide +Frogger POJ - 2253

POJ 2253 Frogger(最小最大距离)

POJ2253 Frogger —— 最短路变形

POJ-2253-Frogger(最短路变形)

POJ-2253 Frogger(最短路)