【二分答案】【Heap-Dijkstra】bzoj2709 [Violet 1]迷宫花园
显然最短路长度随着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]迷宫花园的更多相关文章
- bzoj2709: [Violet 1]迷宫花园
二分答案,spfa check就行了. gb题卡精度. #include<cstdio> #include<iostream> #include<cstring> ...
- 二分+最短路判定 BZOJ 2709: [Violet 1]迷宫花园
BZOJ 2709: [Violet 1]迷宫花园 Sample Input 5 ######### # # # # # # # #S# # ##### # # ## # # # ### ### ## ...
- 洛谷 P1462 通往奥格瑞玛的道路(二分答案,堆优化dijkstra)
传送门 解题思路 首先看题目问题,求经过的所有城市中最多的一次收取的费用的最小值是多少.一看“最大值最小”就想到了二分答案. 在读一遍题目,就是二分收取的费用,然后对于每一个二分的费用,跑一边最短路, ...
- {POJ}{3897}{Maze Stretching}{二分答案+BFS}
题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据. 思路:由于是单调的,可以用二分答案,然后BFS验证.这里用优先队列,每次压入也要进行检查(dis大小)防止数据过多,A*也可以.好久不写图 ...
- BZOJ2547 CTSC2002玩具兵(最短路径+二分答案+最大流)
先不考虑只有一个显得有些特殊的天兵. 可以发现超能力的作用实质上是使兵更换职业.每一个兵到达某个位置最少需要更换职业的次数是彼此独立的,因为如果需要某两人互换职业可以使他们各自以当前职业到达需要到的地 ...
- hihoCoder 第136周 优化延迟(二分答案+手写堆)
题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...
- [CSP-S模拟测试]:maze(二分答案+最短路)
题目传送门(内部题88) 输入格式 第一行两个数$n,m$.第二行四个数$sx,sy,tx,ty$.分别表示起点所在行数.列数,终点所在行数.列数.接下来$n$行,每行$m$个数,描述迷宫.最后一行一 ...
- 洛谷 P1948 [USACO08JAN]电话线Telephone Lines 最短路+二分答案
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 题面 题目链接 P1948 [USACO08JAN]电话线Telephone ...
- POJ3662 [USACO08JAN]Telephone Lines (二分答案/分层图求最短路)
这道题目有两种解法: 1.将每个点视为一个二元组(x,p),表示从起点到x有p条路径免费,相当于构建了一张分层图,N*k个节点,P*k条边.在这张图上用优先队列优化的SPFA算法求解,注意这里的d数组 ...
随机推荐
- composer应用
ubentu安装 进入自己的项目根目录cd/path/to/my/project 下载composer curl -s http://getcomposer.org/installer 把这个文件移到 ...
- Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) C (用map 超时)
C. Bear and Colors time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 使用google api material icons在网页中插入图标
在<head></head>中加入这一句: <link rel='stylesheet' href='http://fonts.googleapis.com/icon?f ...
- LA2995 Image is everything
蓝书P12 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm ...
- C ------ 标准函数介绍
sprintf() 函数原型:int sprintf( char *buffer, const char *format [, argument] ... ); 功能介绍: 1.把一个字符串赋值(拷贝 ...
- 【hdu2825-Wireless Password】AC自动机+DP
http://acm.hust.edu.cn/vjudge/problem/16883 题意:要构造一个长度为n的字符串,然后有m模板串构成一个集合(m<=10),构造出来的字符串至少含有k种模 ...
- bzoj4240 zkw版
复习一波zkw树 很显然最后建出来的图不是单调序列就是一个类似 ...
- KVM的ept机制
转载:http://ytliu.info/blog/2014/11/24/shi-shang-zui-xiang-xi-de-kvm-mmu-pagejie-gou-he-yong-fa-jie-xi ...
- linux知识复习1-dup dup2
#include <sys/stat.h> #include <string.h> #include <fcntl.h> #include <stdio.h& ...
- 热安装NGINX并支持多站点SSL
https://www.moonfly.net/801.html http://www.centoscn.com/image-text/config/2015/0423/5251.html 1.查看n ...