显然最短路长度随着v的变化是单调的,于是可以二分答案,据说spfa在网格图上表现较差。

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef double db;
typedef long long ll;
#define N 101
#define INF 2147483647.0
#define EPS 0.0000001
struct Point{db d;int u;};
bool operator < (Point a,Point b){return a.d>b.d;}
priority_queue<Point>q;
int T,n,m;
db L;
char a[N][N];
int en,v[N*N*4],first[N*N],next[N*N*4];
db w[N*N*4];
void AddEdge(int U,int V,db W)
{
v[++en]=V;
w[en]=W;
next[en]=first[U];
first[U]=en;
}
db d[N*N];
bool vis[N*N];
void dijkstra(int S)
{
for(int i=1;i<=n*m;++i) d[i]=INF;
d[S]=0; q.push((Point){0.0,S});
while(!q.empty())
{
Point x=q.top(); q.pop();
if(!vis[x.u])
{
vis[x.u]=1;
for(int i=first[x.u];i;i=next[i])
if(d[v[i]]>d[x.u]+w[i])
{
d[v[i]]=d[x.u]+w[i];
q.push((Point){d[v[i]],v[i]});
}
}
}
}
int id[N][N],Sta,End;
const int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
bool check(db x)
{
en=0;
memset(first,0,sizeof(int)*(n*m+1));
memset(vis,0,sizeof(bool)*(n*m+1));
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j) if(a[i][j]!='#')
{
for(int k=0;k<2;++k)
if(i+dx[k]>0&&i+dx[k]<=n&&j+dy[k]>0&&j+dy[k]<=m&&a[i+dx[k]][j+dy[k]]!='#')
AddEdge(id[i][j],id[i+dx[k]][j+dy[k]],1.0);
for(int k=2;k<4;++k)
if(i+dx[k]>0&&i+dx[k]<=n&&j+dy[k]>0&&j+dy[k]<=m&&a[i+dx[k]][j+dy[k]]!='#')
AddEdge(id[i][j],id[i+dx[k]][j+dy[k]],x);
}
dijkstra(Sta);
return L-d[End]<EPS;
}
int main()
{
scanf("%d",&T);
for(;T;--T)
{
scanf("%lf%d%d\n",&L,&n,&m);
en=0;
for(int i=1;i<=n;++i)
gets(a[i]+1);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
id[i][j]=++en;
if(a[i][j]=='S') Sta=id[i][j];
else if(a[i][j]=='E') End=id[i][j];
}
db l=0.0,r=10.0;
while(r-l>EPS)
{
db mid=(l+r)/2.0;
if(check(mid)) r=mid;
else l=mid+EPS;
}
printf("%.5lf\n",l);
}
return 0;
}

【二分答案】【Heap-Dijkstra】bzoj2709 [Violet 1]迷宫花园的更多相关文章

  1. bzoj2709: [Violet 1]迷宫花园

    二分答案,spfa check就行了. gb题卡精度. #include<cstdio> #include<iostream> #include<cstring> ...

  2. 二分+最短路判定 BZOJ 2709: [Violet 1]迷宫花园

    BZOJ 2709: [Violet 1]迷宫花园 Sample Input 5 ######### # # # # # # # #S# # ##### # # ## # # # ### ### ## ...

  3. 洛谷 P1462 通往奥格瑞玛的道路(二分答案,堆优化dijkstra)

    传送门 解题思路 首先看题目问题,求经过的所有城市中最多的一次收取的费用的最小值是多少.一看“最大值最小”就想到了二分答案. 在读一遍题目,就是二分收取的费用,然后对于每一个二分的费用,跑一边最短路, ...

  4. {POJ}{3897}{Maze Stretching}{二分答案+BFS}

    题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据. 思路:由于是单调的,可以用二分答案,然后BFS验证.这里用优先队列,每次压入也要进行检查(dis大小)防止数据过多,A*也可以.好久不写图 ...

  5. BZOJ2547 CTSC2002玩具兵(最短路径+二分答案+最大流)

    先不考虑只有一个显得有些特殊的天兵. 可以发现超能力的作用实质上是使兵更换职业.每一个兵到达某个位置最少需要更换职业的次数是彼此独立的,因为如果需要某两人互换职业可以使他们各自以当前职业到达需要到的地 ...

  6. hihoCoder 第136周 优化延迟(二分答案+手写堆)

    题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...

  7. [CSP-S模拟测试]:maze(二分答案+最短路)

    题目传送门(内部题88) 输入格式 第一行两个数$n,m$.第二行四个数$sx,sy,tx,ty$.分别表示起点所在行数.列数,终点所在行数.列数.接下来$n$行,每行$m$个数,描述迷宫.最后一行一 ...

  8. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 最短路+二分答案

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1948 [USACO08JAN]电话线Telephone ...

  9. POJ3662 [USACO08JAN]Telephone Lines (二分答案/分层图求最短路)

    这道题目有两种解法: 1.将每个点视为一个二元组(x,p),表示从起点到x有p条路径免费,相当于构建了一张分层图,N*k个节点,P*k条边.在这张图上用优先队列优化的SPFA算法求解,注意这里的d数组 ...

随机推荐

  1. javascript中arguments的应用——不定项传参求和

    <script type="text/javascript"> window.onload=function(){ function sum(){ var result ...

  2. L2-001. 紧急救援---(Dijkstra,记录路径)

    https://www.patest.cn/contests/gplt/L2-001 L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 ...

  3. Round 0: Regionals 2010 :: NEERC Eastern Subregional

    Round 0: Regionals 2010 :: NEERC Eastern Subregional 贴吧题解(官方)? 网上的题解 水 A Murphy's Law 题意:Anka拿着一块涂着黄 ...

  4. jstack 堆栈日志分析

    一.线程的状态 线程间的状态转换:  1. 新建(new):新创建了一个线程对象. 2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法.该状 ...

  5. linux中nginx重定向方法总结

    linux中nginx 301重定向跳转方法总结 第一种情况:访问aaaaaaa站定向到bbbbbbbbbbb站 复制代码代码如下: server { server_naaaaaaame www.aa ...

  6. JS形参与实参问题

    JavaScript的参数传递也都是采用值传递的方式进行传值. (1)     通过实参调用函数的时候,传入函数里的是实参的副本而不是实参,因此在函数里面修改参数值并不会对实参造成影响. 例如:将全局 ...

  7. 160多条Windows 7 “运行”命令

    160多条Windows 7 “运行”命令: 删除或更改应用程序 = control appwiz.cpl 添加设备 = devicepairingwizard  蓝牙文件传输 = fsquirt  ...

  8. Python学习笔记 - day1 - 概述及安装

    Python概述 Python是一种计算机程序设计语言.我们平时已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合网页编程的JavaScript语言等等. Python ...

  9. RtlInitUnicodeString

    代码1: WCHAR enumeratorName[] = {}; UNICODE_STRING unicodeEnumName; RtlInitUnicodeString(&unicodeE ...

  10. Google Breakpad: 实战crash .

    Google Breakpad: 实战crash . http://blog.csdn.net/zm_21/article/details/24795205 C/C++程序最棘手的时候就是一个字“挂” ...