zoukankan      html  css  js  c++  java
  • POJ 2253 Frogger(floyd)

    http://poj.org/problem?id=2253

    题意 : 题目是说,有这样一只青蛙Freddy,他在一块石头上,他呢注意到青蛙Fiona在另一块石头上,想去拜访,但是两块石头太远了,所以他只有通过别的石头跳过去,所以,从他的石头到Fiona的石头每一条可走的路,假设是n条,就需要你求出frog distance,这个所谓的距离就是指这n条路中,每条路选取组成这条路中最长的那边,最后一共有n条边,找这n条边里最短的那一条输出。

    思路 : 就是一个最短路的问题,不过不需要求最短路的权值和,只需要求出最大跳即可,还要注意,不管几行坐标,前两行分别是Freddy的位置和Fiona的位置,最后输出,不过很多人倒是用了克鲁斯卡尔和prim做的,我一直不明白这个题为什么会转化成最小生成树.........好吧,我才疏学浅..........

    这是几组测试数据:

    2
    0 0
    3 4
    
    3
    17 4
    19 4
    18 5
    
    8
    1 1
    4 0
    1 2
    2 2
    3 2
    4 2
    3 0
    5 1
    
    3
    9 10
    10 10
    100 10
    
    6
    5 5
    100 100
    4 4
    3 3
    2 2
    1 1
    
    5
    1 2
    2 1
    3 2
    4 1
    5 2
    
    3
    999 999
    1 1
    3 3
    
    0
    Scenario #1
    Frog Distance = 5.000
    
    Scenario #2
    Frog Distance = 1.414
    
    Scenario #3
    Frog Distance = 1.414
    
    Scenario #4
    Frog Distance = 1.000
    
    Scenario #5
    Frog Distance = 134.350
    
    Scenario #6
    Frog Distance = 1.414
    
    Scenario #7
    Frog Distance = 1408.557

    对了,每一行输出有一空行,因为一开始没注意结果PE了一次,又一次证明了我有多粗心。。。。。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 
     8 const int maxn = 1011;
     9 const int oo = 1 << 28 ;
    10 
    11 double map[maxn][maxn];
    12 int n,m;
    13 double x[maxn],y[maxn];
    14 
    15 void floyd()
    16 {
    17     for(int k = 0 ; k < n ; k++)
    18     {
    19         for(int i = 0 ; i < n ; i++) //主要针对由i到j的松弛,最终任意两点间的权值都会被分别松弛为最大跳的最小(但每个两点的最小不一定相同)
    20         {
    21             for(int j = 0 ; j < n ; j++)
    22             {
    23               if(map[i][j] > map[i][k]&&map[i][j] > map[k][j])//当边ik,kj的权值都小于ij时,则走i->k->j路线,否则走i->j路线
    24                 {
    25                     if(map[i][k] > map[k][j]) //当走i->k->j路线时,选择max{ik,kj},只有选择最大跳才能保证连通
    26                     map[i][j] = map[i][k];
    27                     else
    28                     map[i][j] = map[k][j];
    29                 }
    30 
    31             }
    32         }
    33     }
    34 }
    35 
    36 void Init()
    37 {
    38     for(int i = 0 ; i < n ; i++)
    39     {
    40         for(int j = 0;  j < n ; j++)
    41         {
    42             map[i][j] = oo ;
    43         }
    44         map[i][i] = 0 ;
    45     }
    46 }
    47 
    48 int main()
    49 {
    50     int cnt = 0;
    51     while(~scanf("%d",&n)&&n)
    52     {
    53         cnt++;
    54         Init();
    55         for(int i = 0 ; i < n ; i++)
    56         {
    57             scanf("%lf %lf",&x[i],&y[i]);
    58         }
    59         for(int  i = 0 ; i < n ; i++)
    60         {
    61             for(int j = 0 ; j < n ; j++)
    62             {
    63                 map[i][j] = sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
    64             }
    65         }
    66         floyd();
    67         printf("Scenario #%d
    ",cnt);
    68         printf("Frog Distance = %.3f
    
    ",map[0][1]);
    69     }
    70     return 0;
    71 }
    View Code
  • 相关阅读:
    Python学习笔记:pip使用技巧
    机器学习笔记:训练集、验证集和测试集区别
    MySQL学习笔记:3道面试题小测
    Python学习笔记:精确的四舍五入
    Hive学习笔记:列转行之collect_list/collect_set/concat_ws
    Python学习笔记:6个代码性能坏习惯
    爬虫学习笔记:打造自己的代理池
    Mysql学习笔记:5.5升级至8.0版本
    机器学习笔记:sklearn.model_selection.train_test_split切分训练、测试集
    HashSet其实就那么一回事儿之源码浅析
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3261683.html
Copyright © 2011-2022 走看看