题目大意:
给出一个图,其中有一些点是出口,现在有一个罪犯有一个警察,各在两个不同的点。其中警察有一个最大速度160,问罪犯最少需要多大的速度,保证能从某个出口逃跑。

一开始看了题目没什么感觉,当将题目看了两三遍后就发现只要到某一个点罪犯用的时间比警察的少则在那个点不会被抓,很显然,到某一个点会走最短路径。所以要用到两次最短路算法,二分罪犯车子的速度,然后搜索在当前速度下是否可以逃脱。

注意的地方:

1、对于无解可以spfa或者bfs判断一下,上面提出的有解的必要条件肯定没问题

2、对于罪犯对整个图的最短路,需要注意的是不能经过警察的起点

3、在二分速度之后,判断可以bfs,或者dfs,便是判断可以走到哪些点,条件就是罪犯到达的时间早于警察到达的时间,如果可以则扩展,注意的是每个点只需要判断一次,不需要像DFS那样恢复现场

4、这题的精度要求是1e-6,可是sample给的精度很高,搞得我们都用了1e-10,其实姿势正确1e-6就能过,原以为样例小数据都能这么大误差,所以把精度控制地很严,导致多次TLE

PS:spfa写错好几个地方 ,SB到极点

#include <iostream>
#include <cstdio>
#include <climits>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 110;
const int inf = 1600005;
int map[maxn][maxn],Exit[maxn];
int dis1[maxn],dis2[maxn],vis[maxn];
double ptime[maxn];
int n,m,e,b,p;
struct node
{int v,len,next;
}edge[maxn*maxn];
int head[maxn],id;
void add_edge(int u,int v,int len)
{edge[id].v = v;edge[id].len = len; edge[id].next = head[u];head[u] = id++;edge[id].v = u;edge[id].len = len; edge[id].next = head[v];head[v] = id++;
}
inline double max(double x,double y)
{return x > y ? x : y;
}
void spfa(int s,int dis[])
{for(int i = 0; i <= n; i++)dis[i] = inf;memset(vis,0,sizeof(vis));queue<int>que;int now,tmp;dis[s] = 0;vis[s] = 1;que.push(s);while( !que.empty()){int u = que.front();que.pop();vis[u] = 0;for( int id = head[u]; id != -1; id = edge[id].next){int v = edge[id].v;if( v == p)continue;if( dis[v] > dis[u] + edge[id].len){dis[v] = dis[u] + edge[id].len;if( !vis[v]){vis[v] = 1;que.push(v);}}}}
}
bool dfs(int u,double speed)
{if( Exit[u] )return true;for(int id = head[u]; id != -1; id = edge[id].next){int v = edge[id].v;if( !vis[v] && dis1[v]*1.0*160 < dis2[v]*speed){vis[v] = 1;if( dfs(v,speed) )return true;}}return false;
}
void slove()
{double l = 0,r = 0,m;for(int i=1;i<=n;i++){if(!dis2[i] ) continue;r=max(r,(double)dis1[i]*160/dis2[i]);}double ans = -1;r += 2*(1e-7);while( r - l > 1e-7){m = (l+r)*0.5;memset(vis,0,sizeof( vis ));if(dfs(b,m)){r = m;ans = m;}else l = m;}if( ans < 0)puts("IMPOSSIBLE");elseprintf("%.10lf\n",ans);
}
int main()
{int i,j,u,v,len;while( scanf("%d%d%d",&n,&m,&e) != EOF){memset(head,-1,sizeof(head));id = 0;while( m -- ){scanf("%d%d%d",&u,&v,&len);add_edge(u,v,len);}memset(Exit,0,sizeof(Exit));for( i = 0; i < e; i++){scanf("%d",&u);Exit[u] = 1;}scanf("%d%d",&b,&p);spfa(b,dis1);spfa(p,dis2);slove();}return 0;
}/*3 2 1
1 2 7
2 3 8
1
3 2
3 2 1
1 2 7
2 3 8
1
2 3
4 4 2
1 4 1
1 3 4
3 4 10
2 3 30
1 2
3 4*/

转载于:https://www.cnblogs.com/LUO257316/archive/2013/05/28/3220804.html

HDU3143Speedy Escape 最短路+二分+搜索相关推荐

  1. 108. 将有序数组转换为二叉搜索树(二分+搜索)

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 二分+搜索. /*** Definition ...

  2. Luogu P1462 通往奥格瑞玛的道路(最短路+二分)

    P1462 通往奥格瑞玛的道路 题面 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己 ...

  3. P1462 通往奥格瑞玛的道路[最短路+二分+堆优化]

    题目来源:洛谷 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描 ...

  4. hdu3329 二分+搜索

    题意:       给你一个岛,然后岛的外侧开始涨水(内侧不涨只有外侧,也就是里面的0永远是0),问最少涨水多少才能把岛分成两个或者两个以上. 思路:       可以二分枚举水的高度(数据不大估计暴 ...

  5. 中石油训练赛 - 小说(最短路+二分)

    题目链接:点击查看 题目大意:给出一个无环无向图,以及k,定义答案是点1到点n的任意一条路径上,所经过的所有边的权值中的第k大值,求答案的最小值.(题目是中文题面,没看懂大意可以直接去看原题目..) ...

  6. jzoj1610(初中)-导弹【最大匹配,最短路,二分答案】

    正题 题目大意 有KKK个点,NNN个点a∈Aa\in Aa∈A,MMM个点b∈Bb\in Bb∈B. 给x∈Bx\in Bx∈B点集匹配一个y∈Ay\in Ay∈A点集的点,使他之间的最长最短路径最 ...

  7. 【HDU - 1839】Delay Constrained Maximum Capacity Path(最短路 + 二分)

    题干: 考虑一个包含 N 个顶点的无向图,编号从 1 到 N,并包含 M 条边.编号为 1 的顶点对应了一个矿藏,可从中提取珍稀的矿石.编号为 N 的顶点对应了一个矿石加工厂.每条边有相应的通行时间 ...

  8. 2013校队选拔——最短路——二分最大边的最小值

    1012: City Tour Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 63  Solved: 11 [Submit][Status][Web ...

  9. 【NOIP2013】华容道 最短路优化搜索(spfa)

    华容道 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 34  Solved: 14 [Submit][Status][Web Board] Descr ...

最新文章

  1. 安全 - MySQL 出现严重的密码安全漏洞,许多系统存在风险
  2. linux c 链接详解4-共享库
  3. Java Date Time 教程-java.sql.Timestamp
  4. Microsoft .NET Pet Shop 4 架构与技术分析(转)
  5. Visual Studio 2010安装教程
  6. php重载父类属性,子类重写父类属性的问题。。。。求解惑
  7. SUSE Linux维护笔记三
  8. 在Ubuntu上安装Git
  9. IDEA 2017.3.3 Mybatis Plugin 3.154 安装和破解方法(Windows系统)
  10. java二叉树的遍历,递归与非递归方法
  11. 采集上市公司信息的10个经典方法
  12. 《周易》中的君子形象--http://cul.china.com.cn/guoxue/2018-06/04/content_40369049.htm
  13. 水晶报表 (Crystal Reports 2008)的配置
  14. [Python] 央视新闻联播推送
  15. 使用frp配置内网访问(穿透)教程(超详细,简单)
  16. 解决git在push时报错fatal: unable to access ‘https://github.com/sup0C/a.git/‘: errno 10054
  17. C Primer Plus(6) 中文版 第5章 运算符、表达式和语句 5.5 类型转换
  18. 奕新集团RAC 11g 生产库环境(待完善无图)
  19. 如何解析喜马拉雅的音频文件.
  20. java 使用jacob实现word转pdf

热门文章

  1. nginx http proxy 正向代理
  2. 操作系统--处理机调度
  3. 命令行请求jsp页面_JSP 之 8种HTTP的请求方式 之 页面组成等
  4. c语言两种排序方法的组合,排列和组合算法的实现方法_C语言经典案例
  5. ieda 远程调试hive_idea 远程调试
  6. i5四核八线程怎么样_同样四核八线程,Ryzen 3 3100和3300X区别大了!
  7. 计算机技术会议排名,计算机学科会议排名
  8. 【5分钟系列】搭建基于docker环境搭建下springboot-mysql项目框架
  9. 终于写完了!PyCharm操作手册 V1.0版本
  10. 5个无聊Python程序,用Python整蛊你的朋友们吧