题意:有两只青蛙,a在第一个石头,b在第二个石头,a要到b那里去,每种a到b的路径中都有最大边,求所有这些最大边的最小值。
思路:将所有边长存起来,排好序后,二分枚举答案。

  时间复杂度比较高,344ms。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h> using namespace std;
const int maxn=;
const int INF=0x3f3f3f3f;
double w[maxn][maxn]; //存储边长
double wlen[];
int con[maxn][maxn]; //con[i][j]=1表示i、j连通,con[i][j]=0表示不连通
int idx;
int n;
struct Node{
int x,y;
}node[maxn];
int main()
{
int t=,a,b;
double length;
int ans;
while(scanf("%d",&n)!=EOF){
if(n==)
break;
t++;
idx=;
memset(w,,sizeof(w));
printf("Scenario #%d\n",t);
for(int i=;i<n;i++){
scanf("%d%d",&a,&b);
node[i].x=a;
node[i].y=b;
}
for(int i=;i<n;i++){
for(int j=i+;j<n;j++){
//pow传递的参数先要强制转换成double,否则提交编译错误
length=pow(double(node[j].x-node[i].x),)+pow(double(node[j].y-node[i].y),);
length=sqrt(length);
w[i][j]=w[j][i]=length;
wlen[idx++]=length;
}
}
sort(wlen,wlen+idx);
//二分枚举所有可能的值,floyd的时候考虑所有长度不大于该值的边
int l=,r=idx-,mid;
while(l<=r){
mid=(l+r)>>;
for(int i=;i<n;i++){
for(int j=i+;j<n;j++){
//初始化,con[i][j]=1表示边i、j长度不大于枚举值,=0表示大于枚举值
if(w[i][j]>wlen[mid])
con[i][j]=con[j][i]=;
else
con[i][j]=con[j][i]=;
}
}
for(int k=;k<n;k++){
for(int i=;i<n;i++){
for(int j=;j<n;j++){
//只要有一对con[i][k]、con[k][j]连通,con[i][j]就连通
con[i][j]|=con[i][k]&con[k][j];
}
}
}
if(con[][]){
r=mid-;
ans=mid;
}
else{
l=mid+;
}
} printf("Frog Distance = %.3lf\n",wlen[ans]);
puts("");
}
return ;
}

这里附上别人的代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
double dist[][]; //dist[i][j]表示i到j的路径中边的最大值的最小值
int n;
struct Node {
int x;
int y;
} e[];
void Floyd() {
for(int k=; k<n; k++) {
for(int i=; i<n; i++) {
for(int j=; j<n; j++) {
if(max(dist[i][k],dist[k][j])<dist[i][j])
dist[i][j]=max(dist[i][k],dist[k][j]);
}
}
} }
int main() {
int t=;
while(~scanf("%d",&n)) {
if(n==)break;
for(int i=; i<n; i++) {
scanf("%d%d",&e[i].x,&e[i].y);
}
for(int i=; i<n; i++) {
for(int j=; j<n; j++) {
dist[i][j]=sqrt(pow((double)(e[i].x-e[j].x),)+pow((double)(e[i].y-e[j].y),));
}
}
Floyd();
printf("Scenario #%d\n",t++);
printf("Frog Distance = %.3f\n\n",dist[][]); }
}

POJ 2253 Frogger (求某两点之间所有路径中最大边的最小值)的更多相关文章

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

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

  2. POJ. 2253 Frogger (Dijkstra )

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

  3. 最短路(Floyd_Warshall) POJ 2253 Frogger

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

  4. POJ 2253 Frogger(dijkstra 最短路

    POJ 2253 Frogger Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fion ...

  5. dfs+记忆化搜索,求任意两点之间的最长路径

    C.Coolest Ski Route 题意:n个点,m条边组成的有向图,求任意两点之间的最长路径 dfs记忆化搜索 #include<iostream> #include<stri ...

  6. CCF(地铁修建):向前星+dijikstra+求a到b所有路径中最长边中的最小值

    地铁修建 201703-4 这题就是最短路的一种变形,不是求两点之间的最短路,而是求所有路径中的最长边的最小值. 这里还是使用d数组,但是定义不同了,这里的d[i]就是表示从起点到i的路径中最长边中的 ...

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

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

  8. poj 2253 Frogger (dijkstra最短路)

    题目链接:http://poj.org/problem?id=2253 Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

  9. poj 2253 Frogger 解题报告

    题目链接:http://poj.org/problem?id=2253 题目意思:找出从Freddy's stone  到  Fiona's stone  最短路中的最长路. 很拗口是吧,举个例子.对 ...

随机推荐

  1. c/c++面试总结(3)

    7.vector和list的区别(这个也算是经常问的) vector和数组类似,拥有一段连续的内存空间,并且起始地址不变,这样对随机的读取很有效率(就是我们所有的[]运算符了),因为内存是连续的如果我 ...

  2. 嵌入式系统图形库GUI核心模块介绍

    本文转载自:http://blog.csdn.net/xteda/article/details/6575278 (作者 冯青华 信庭嵌入式工作室(www.xteda.com)- CEO Blog:h ...

  3. mysql:The total number of locks exceeds the lock table size

    使用mysql InnoDB存储引擎进行大量数据的更新,删除的时候容易引发”The total number of locks exceeds the lock table size”问题,解决方法之 ...

  4. windows phone 8 开发系列(一)环境搭建

    一:前奏说明 本人一名普通的neter,对新玩意有点小兴趣,之前wp7出来的时候,折腾学习过点wp7开发,后来也没怎么用到(主要对微软抛弃wp7的行为比较不爽),现在wp8已经出来一段时间了,市场上也 ...

  5. 【风马一族_Android】 图能

    ---------------------------------- 第一次 名称:相片查看器 ---------------------------------- 通过3D.自动播放幻灯片.旋转.跳 ...

  6. 如何判断PHP 是ts还是nts版的

    通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说应该是ts版,否则是nts版.

  7. 单选复选按钮以及Toast学习笔记

    1:单选按钮是以组的形式呈现,xml布局文件中需要定义一个RadioGroup,然后在这个组内再定义RadioButton.在java代码中为该按钮添加监听时,需要用组名来引用对应的方法setOnCh ...

  8. C#中泛型和单链表

      泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能.泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类 ...

  9. (转)Android Support Percent百分比布局

    一.概述 周末游戏打得过猛,于是周天熬夜码代码,周一早上浑浑噩噩的发现 android-percent-support-lib-sample(https://github.com/JulienGeno ...

  10. Microsoft Azure 全球状态

    除了mooncake的中国大陆区域 Azure status http://azure.microsoft.com/en-us/status/?rnd=1#current http://azure.m ...