题目链接:https://vjudge.net/problem/POJ-2253

思路:

从一号到二号石头的所有路线中,每条路线中都个子选出该路线中两点通路的最长距离,并在这些选出的最长距离选出最短路的那个距离X,

就是青蛙距离,即青蛙至少能跳X米,才能安全的到达二号,因为什么,再看看第一句话。

再想,我们知道,djikstra中的价值数组存的是从u点到其他所有点的最短距离,way[ 1 ] 是u到1的最短距离, way[ x ] 是u到x的最短距离,

我们知道djikstra的时间复杂度是O(n^2),这个时间复杂是是因为我们访问了所有的从一个城市出发到其他城市所有情况(除去已经最优的城市),

有n个城市,去其他(除去最优)的个城市,所有比较次数可以用接近(n^2)表示。

我为什么要说这个呢,我只想表达。。。我只是想强调dijstra保存了最优路线和不确定路线的价值,访问了其他不确定的路线去更新不确定价值的路线,

慢慢得到所有最优路线。

那么,我们可不可以把这个价值数组利用在这个题目上,改变维护方式呢?

我们可以这么想题目意思,价值数组只存一条路线,那么它一定存的是到该城市的最长距离,然后,我们需要把这个最长距离尽可能变小,即最小化最大距离。

那么我们就可以用dijkstra算法来求这个问题,那我们需要怎么维护。

(1):首先,价值数组初始化一样。

(2):我们需要找出最小的价值数组,为什么?(里面存的是起始点到该点的所有路线中最小化的最大距离)

(3):我们找出了最小的价值数组,即得到了城市编号,那么,我们用该点去访问其他不确定的城市。

(4): 维护方法 :way[ k ] > max( dis[ x ][ k ], way[ x ] ),  max( dis[ x ][ k ], way[ x ] )表示,从起始点到x点所有路线的的最小化的最大距离和x到k的距离选出最大的和

从起始点到k点部分路线的的最小化的最大距离比较,如果k点的从起始点到k点部分路线的的最小化的最大距离比从起始点到x点所有路线的的最小化的最大距离和x到k的距离选出最大的

的大,说明k可以被优化,那么  :way[ k ] =max( dis[ x ][ k ], way[ x ] ),  max( dis[ x ][ k ], way[ x ] )。

(5):直到最后得到从起始点到其他所有点的最小化最大距离。

( 代码就不加上注释了,只要上面的理解了,代码很容易理解 )

这个题目在思维上还是有点难的,可以慢慢理解。


 #include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std; typedef long long LL;
#define inf (1LL << 30) - 1
#define rep(i,j,k) for(int i = (j); i <= (k); i++)
#define rep__(i,j,k) for(int i = (j); i < (k); i++)
#define per(i,j,k) for(int i = (j); i >= (k); i--)
#define per__(i,j,k) for(int i = (j); i > (k); i--) const int N = ;
double p_x[N];
double p_y[N];
double dis[N][N];
bool vis[N];
double way[N];
int n,x,y; void init(){
rep(i,,n) rep(j,,n){
if(i == j) dis[i][j] = ;
else dis[i][j] = inf;
}
rep(i,,n) vis[i] = false;
} void input(){ rep(i,,n){
cin >> p_x[i] >> p_y[i];
}
} inline double fun_dis(double x1, double y1, double x2, double y2){
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
} void calculate_dis(){ rep(i,,n){
rep(j,,n){
double tmp_dis = fun_dis(p_x[i],p_y[i],p_x[j],p_y[j]);
if( tmp_dis < dis[i][j] )
dis[i][j] = dis[j][i] = tmp_dis;
}
}
} void dijkstra(){ rep(i,,n) way[i] = dis[][i];
vis[] = true; rep(i,,n){ int x = -;
double v = inf; rep(j,,n){
if(!vis[j] && v > way[j]) v = way[x = j];
} if(x == -) continue;
vis[x] = true; rep(k,,n){
if(!vis[k] && way[k] > max(way[x], dis[x][k])){
way[k] = max(way[x], dis[x][k]);
}
}
}
} int main(){ ios::sync_with_stdio(false);
cin.tie(); int cnt = ;
while(cin >> n){
if(n == ) break; init();
input();
calculate_dis();
dijkstra(); cout << "Scenario #" << ++cnt << endl;
cout << "Frog Distance = " << fixed << setprecision() << way[] << endl;
cout << endl;
} getchar();getchar(); return ;
}

kuangbin专题专题四 Frogger POJ - 2253的更多相关文章

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

    The Tourist Guide Mr. G. works as a tourist guide. His current assignment is to take some tourists f ...

  2. Frogger POJ - 2253(求两个石头之间”所有通路中最长边中“的最小边)

    题意 ​ 题目主要说的是,有两只青蛙,在两个石头上,他们之间也有一些石头,一只青蛙要想到达另一只青蛙所在地方,必须跳在石头上.题目中给出了两只青蛙的初始位置,以及剩余石头的位置,问一只青蛙到达另一只青 ...

  3. Frogger POJ - 2253

    题意 给你n个点,1为起点,2为终点,要求所有1到2所有路径中每条路径上最大值的最小值. 思路 不想打最短路 跑一边最小生成树,再扫一遍1到2的路径,取最大值即可 注意g++要用%f输出!!! 常数巨 ...

  4. Frogger - poj 2253 (Dijkstra)

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28802   Accepted: 9353 Description Fr ...

  5. 「kuangbin带你飞」专题十四 数论基础

    layout: post title: 「kuangbin带你飞」专题十四 数论基础 author: "luowentaoaa" catalog: true tags: mathj ...

  6. 最短路(Floyd_Warshall) POJ 2253 Frogger

    题目传送门 /* 最短路:Floyd算法模板题 */ #include <cstdio> #include <iostream> #include <algorithm& ...

  7. 开发指南专题十四:JEECG微云高速开发平台MiniDao 介绍

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhangdaiscott/article/details/27068645   开发指南专题十四:J ...

  8. POJ 2253 Frogger ,poj3660Cow Contest(判断绝对顺序)(最短路,floyed)

    POJ 2253 Frogger题目意思就是求所有路径中最大路径中的最小值. #include<iostream> #include<cstdio> #include<s ...

  9. POJ. 2253 Frogger (Dijkstra )

    POJ. 2253 Frogger (Dijkstra ) 题意分析 首先给出n个点的坐标,其中第一个点的坐标为青蛙1的坐标,第二个点的坐标为青蛙2的坐标.给出的n个点,两两双向互通,求出由1到2可行 ...

随机推荐

  1. C#:foreach语句,yield语句

    原文:C#:foreach语句,yield语句 1. foreach语句 C#编译器会把foreach语句转换为IEnumerable接口的方法和属性. foreach (Person p in pe ...

  2. Win8 Metro(C#)数字图像处理--3.4图像信息熵计算

    原文:Win8 Metro(C#)数字图像处理--3.4图像信息熵计算 [函数代码] /// <summary> /// Entropy of one image. /// </su ...

  3. qt下的时钟程序(简单美丽,继承自QWidget的Clock,用timer调用update刷新,然后使用paintEvent作画就行了,超详细中文注释)good

    最近抽空又看了下qt,发现用它来实现一些东西真的很容易比如下面这个例子,绘制了个圆形的时钟,但代码却清晰易懂[例子源自奇趣科技提供的例子]因为清晰,所以就只写注释了,吼吼其实也就这么几行代码头文件 / ...

  4. 第一次做C++项目的一点小总结

    本人原本一菜鸟java程序员,但业余涉猎还算广泛,稍微了解些C++内容.主要之前曾爱好过汇编语言.所以对于C语言能从汇编层面加以理解,C++则是在此基础上又加了面向对象.stl等一类东西嘛. 这次做了 ...

  5. Android源码中编译出指定jar包

    今天想把android源码/vendor/letv/frameworks/base/java下的源码编译成 framework-letv.jar供乐乐语音客户端使用,编译完后,发现jar包文件虽然生成 ...

  6. SpringMVC与uploadify结合进行上传

    uploadify是一个第三方js插件,支持多文件上传,拥有较为强大的上传功能 1.uploadify实现 下载其flash版本 http://www.uploadify.com/  解压后将其内容区 ...

  7. Oracle 裁掉北京研发团队,相应职位撤回美国(收购了NetSuite,LogFire,Dyn)

    根据中国日报报道,2017年1月14日上午9点09分,甲骨文北京研发团队的同事收到了来自BU老大的一封邮件.邮件上提及,由于市场变化,甲骨文开始整合各研发中心资源公司在云计算方向发力,文末单独提出了甲 ...

  8. YARN分析系列之三 -- 从脚本入口分析 ResourceManager的初始化过程

    1. 由脚本找到 RM 主类 这部分,我们从脚本作为入口去逐步深入ResourceManager源码. 从 Hadoop 官方文档 中可以看到 ResourceManager 的启动命令为: Usag ...

  9. JS数据结构第四篇 --- 栈

    一.什么是数据结构栈 在数据结构中有一个栈结构,在内存空间中也有一个栈空间,这两个”栈“是两个不同的概念.这篇我们说的是数据结构中的栈.栈是一种特殊的线性表,特殊性在哪?就是只能在栈顶进行操作,往栈顶 ...

  10. MyBatis 源码分析

    MyBatis 运行过程 传统的 JDBC 编程查询数据库的代码和过程总结. 加载驱动. 创建连接,Connection 对象. 根据 Connection 创建 Statement 或者 Prepa ...