题目链接: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. .gitignore 配置后无效

    利用.gitignore过滤文件,如编译过程中的中间文件,等等,这些文件不需要被追踪管理. 现象: 在.gitignore添加file1文件,以过滤该文件,但是通过Git status查看仍显示fil ...

  2. .NET DataTable转换为JSON格式的字符串

    在进行数据传递的时候,有时我们需要通过Ajax的方式或者其他的方式传递一个数据列表,可以将DataTable或者其他形式的数据列表转换为JSON的格式,通过Ajax实体的形式进行传递. 比如说: // ...

  3. ASP.NET MVC控制器Controller

    控制器的定义 MVC模式下的控制器(Controller)主要负责响应用户的输入,并且在响应时可能的修改模型(Model). 之前的URL访问,通常是通过指定服务器的路径来实现,如访问URL:http ...

  4. MySQL操作详解

    创建并使用数据库 查看服务器上的数据库:SHOW DATABASES; 创建数据库:CREATE DATABASE <数据库名>; 指明使用何数据库:USE <数据库名> 创建 ...

  5. Sailfish OS 2.1.0 发布,带来重大的架构变化

    Sailfish OS 2.1.0 Iijoki 发布了. Iijoki通过引入Qt 5.6 UI框架.BlueZ 5 蓝牙堆栈和 64 位架构的基本实现,为Sailfish操作系统带来了重大的架构变 ...

  6. coci2018 题解

    plahte 给定一些矩形和一些有颜色的点,求每个矩形上有多少种颜色的点,保证矩形只有包含和不相交两种关系,规模 \(10^5\). 把每个矩形看成一个点,用扫描线建出森林,同时也顺便处理点. 然后做 ...

  7. Qt使Release版本可调试

    只需在pro文件中加入 QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_LFLAGS_RELEASE = $$ ...

  8. Qt在Windows下的三种编程环境搭建(图文并茂,非常清楚)good

    尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/17363165 从QT官网可以得知其支持的平台.编译器 ...

  9. c# 文本超长截断

    根据控件大小进行截断 private void SetStringTruncat(Static.LabelEx lbl) { string oldStr = lbl.Text; if (string. ...

  10. PC-lint 简明教程(C/C++静态代码检查工具)

    前言 PC-lint是一款小而强大的C/C++静态代码检查工具,它可以检查未初始化变量,数组越界,空指针等编译器很难发现的潜在错误.在很多专业的软件公司如Microsoft,PC-Lint检查无错误无 ...