题目链接: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. 【Gerrit】Performance Cheat Sheet

    首先说下做这件事情的主因,组内有人说Project repo sync有点慢,废话不多说,直接上图. 相关官方文档参考链接: 我的数据: ~/review_site/logs# fgrep " ...

  2. 华为虚拟机结合VMware搭建环境测试snmp

    最近在研究zabbix监控,在实际生产环节中,我们不单单是需要对linux主机进行监控还需要对网络设备防火墙等等进行监控,那么在linux主机上我们可以安装zabbix-agernt,但是在路由器交换 ...

  3. Hadoop中重要概念简要总结

    Hadoop是一个利用大规模计算机集群,可处理大量数据的分布式并行框架. Hadoop 官网 Hadoop的核心设计包括HDFS和MapReduce. HDFS HDFS(Hadoop Distrib ...

  4. 国家气象局 天气预报 城市代码(JSON格式)

    如题 { "城市代码": [ { "省": "北京", "市": [ { "市名": "北 ...

  5. SpringMVC与uploadify结合进行上传

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

  6. 使用VS2010开发Qt程序的4点经验(QT4到QT5的升级,更改sln文件,切换工程使用的Qt库,在VS的Solution Explorer视图中建立文件夹)

    导读 相比于Qt Creator,我更喜欢用VS2010来进行开发.虽然启动时间相对较慢,但是VS下强大的快捷键和丰富的插件,以及使用多年的经验,都让我觉得在开发过程中得心应手.其中最重要的一点是,有 ...

  7. 网络基础与FTP准备

    一网络基础 1.端口: 端口是为了将同一台电脑上的不同程序进行隔离 (IP是在找电脑,端口是在找电脑上的程序) 实例: MySQL是一个软件,帮助我们在硬盘上进行操作,默认端口是3306 Redis是 ...

  8. 深入理解计算机系统 BombLab 实验报告

    又快有一个月没写博客了,最近在看<深入理解计算机系统>这本书,目前看完了第三章,看完这章,对程序的机器级表示算是有了一个入门,也对 C 语言里函数栈帧有了一个初步的理解. 为了加深对书本内 ...

  9. 写在Logg SAP项目上线之际

    根据大环境大行业的惯用做法,公司建立Logg品牌是在意料之中.毫无意外的,Logg也要上到SAP系统中. 其实按它的业务模式来说上SAP系统并不困难,早在几年前就已经有做过了.无非就是接单不生产,外包 ...

  10. niaobulashi-一个基于springboot shrio的权限管理系统

    github项目地址:https://github.com/niaobulashi/niaobulashi springboot学习地址:http://www.ityouknow.com/spring ...