POJ 2253 Frogger (求某两点之间所有路径中最大边的最小值)
题意:有两只青蛙,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 (求某两点之间所有路径中最大边的最小值)的更多相关文章
- POJ 2253 Frogger ,poj3660Cow Contest(判断绝对顺序)(最短路,floyed)
POJ 2253 Frogger题目意思就是求所有路径中最大路径中的最小值. #include<iostream> #include<cstdio> #include<s ...
- POJ. 2253 Frogger (Dijkstra )
POJ. 2253 Frogger (Dijkstra ) 题意分析 首先给出n个点的坐标,其中第一个点的坐标为青蛙1的坐标,第二个点的坐标为青蛙2的坐标.给出的n个点,两两双向互通,求出由1到2可行 ...
- 最短路(Floyd_Warshall) POJ 2253 Frogger
题目传送门 /* 最短路:Floyd算法模板题 */ #include <cstdio> #include <iostream> #include <algorithm& ...
- POJ 2253 Frogger(dijkstra 最短路
POJ 2253 Frogger Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fion ...
- dfs+记忆化搜索,求任意两点之间的最长路径
C.Coolest Ski Route 题意:n个点,m条边组成的有向图,求任意两点之间的最长路径 dfs记忆化搜索 #include<iostream> #include<stri ...
- CCF(地铁修建):向前星+dijikstra+求a到b所有路径中最长边中的最小值
地铁修建 201703-4 这题就是最短路的一种变形,不是求两点之间的最短路,而是求所有路径中的最长边的最小值. 这里还是使用d数组,但是定义不同了,这里的d[i]就是表示从起点到i的路径中最长边中的 ...
- Frogger POJ - 2253(求两个石头之间”所有通路中最长边中“的最小边)
题意 题目主要说的是,有两只青蛙,在两个石头上,他们之间也有一些石头,一只青蛙要想到达另一只青蛙所在地方,必须跳在石头上.题目中给出了两只青蛙的初始位置,以及剩余石头的位置,问一只青蛙到达另一只青 ...
- poj 2253 Frogger (dijkstra最短路)
题目链接:http://poj.org/problem?id=2253 Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissi ...
- poj 2253 Frogger 解题报告
题目链接:http://poj.org/problem?id=2253 题目意思:找出从Freddy's stone 到 Fiona's stone 最短路中的最长路. 很拗口是吧,举个例子.对 ...
随机推荐
- CString使用
1. 空间分配,如果不是它自己的空间分配方式,需要用函数来手动分配空间,否则大家指向同一块地址,取得内容一样 例子,读取文件到CString ,没有给CString 对象分配空间,而且不是他定义的开拓 ...
- apache+tomcat整合
一 .Apache与Tomcat的比较 apache支持静态页面,tomcat支持动态的,比如servlet等. 一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是 ...
- C程序调用shell脚本共有三种方法
C程序调用shell脚本共有三种法子 :system().popen().exec系列函数call_exec1.c ,内容为:system() 不用你自己去产生进程,它已经封装了,直接加入自己的命令e ...
- 连续子数组的最大和/1007. Maximum Subsequence Sum (25)
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...
- docker 感性体验
Docker 1.0正式发布!1.0 版本包含很多新特性,这也是 Docker 的首个产品级的版本.从今天开始,你将会一直听到一个新的概念 —— Docker as a platform ,其组件包括 ...
- 深入理解ThreadLocal(一)
Android里,在不同的线程(假设子线程已经创建了Looper)中创建Handler时,并不需要显式指定Looper,系统能自动找到该线程自己的Looper.不同线程的Looper相互独立,之所以能 ...
- iOS 10的23个隐藏新特性-b
上周iOS 10正式版推送后,24小时的更新率已经超过15%,实在惊人.虽然有着初期变砖.5S6卡顿.移动VoLTE无法使用.美版无信号等BUG,但不可忽视的是,iOS 10还是带来了很多从前没有的功 ...
- Jquery datatables 重载数据方法
参考这里 { RefreshTable('#table-example', '/BlogManage/GetLabelData'); } function RefreshTable(tableId, ...
- SharePoint 优化显示WebParts
在开发sharepoint中,经常遇到需要自定义显示列表中的一部分作为导航的内容, 如公告栏,新闻链接,最新动态等.... 我们通常需要显示一个列表的标题,并且限制字符长度, 外加一些条件,如按创建的 ...
- SCRUM团队的三个角色
Scrum团队中包括三个角色,他们分别是产品负责人.开发团队和 Scrum Master. Scrum 团队是自组织.跨职能的完整团队.自组织团队决定如何最好地完成他们的工作,而不是由团队外的其他人来 ...