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



Sample Input
5 10.28 ######### # # # # # # # #S# # ##### # # ## # # # ### ### ##E # ######### 4.67 ######### # ## ## ### #S# # # # E ## # # ##### # ## ### # ##### # # # # ######### 39.06 ######### # # # # # # # # E# # # # # # # # ## ### # # # #S# # ##### # ######### 24.00 ######### # ## # # ## ## # # ## ###S## E# ### # ## # # # # ##### # # ######### 25.28 ######### # S##E# # # ### # # # ## # # ## ### # # #### # # # ### # # #########
Sample Output 0.41000 4.67000 3.34000 5.00000 1.69000
HINT
.gif)
/*
分析:符合二分的原理:当v变大,dis一定变大,而且v的具体范围很小,才是0--10,符合二分原理。
二分出一个V,就用spfa求一次最短路,看看最短的长度与L大小关系,以此来二分。
*/
#include<cmath>
#include<iostream>
using namespace std;
#include<cstdio>
#include<queue>
#include<cstring>
#define R 110
int T,r,c;
bool inque[R*R];
char ditu[R][R];
double L,z,y;
double dist[R*R];
int head[],bh=,sta,endd,bhh[R][R];
struct Edge{
int v,last;
double w;
}edge[];
int t=;
void input()
{
scanf("%lf%d%d\n",&L,&r,&c);
for(int i=;i<=r;++i)
{
for(int j=;j<=c;++j)
{
scanf("%c",&ditu[i][j]);
if(ditu[i][j]==)
{
bh++;
bhh[i][j]=bh;
}
if(ditu[i][j]=='S')bhh[i][j]=sta=++bh;
if(ditu[i][j]=='E')bhh[i][j]=endd=++bh;
}
scanf("\n");
} }
void add_edge(int i,int j)
{
if(i->&&ditu[i-][j]!='#') {++t;edge[t].v=bhh[i-][j];edge[t].w=-;edge[t].last=head[bhh[i][j]];head[bhh[i][j]]=t;}
if(i<r&&ditu[i+][j]!='#') {++t;edge[t].v=bhh[i+][j];edge[t].w=-;edge[t].last=head[bhh[i][j]];head[bhh[i][j]]=t;}
if(j->&&ditu[i][j-]!='#') {++t;edge[t].v=bhh[i][j-];edge[t].w=;edge[t].last=head[bhh[i][j]];head[bhh[i][j]]=t;}
if(j<c&&ditu[i][j+]!='#') {++t;edge[t].v=bhh[i][j+];edge[t].w=;edge[t].last=head[bhh[i][j]];head[bhh[i][j]]=t;}
}
void build_tu()
{
for(int i=;i<=r;++i)
for(int j=;j<=c;++j)
if(ditu[i][j]!='#')
{
add_edge(i,j);
}
}
double SPFA(double ww)
{
for(int i=;i<=bh;++i)
dist[i]=(<<)-;
dist[sta]=;
memset(inque,false,sizeof(inque));
queue<int>Q;
Q.push(sta);
inque[sta]=true;
while(!Q.empty())
{
int nowt=Q.front();
Q.pop();
inque[nowt]=false;
for(int l=head[nowt];l;l=edge[l].last)
{
if(edge[l].w<)
{
if(dist[edge[l].v]>dist[nowt]+ww)
{
dist[edge[l].v]=dist[nowt]+ww;
if(!inque[edge[l].v])
{
inque[edge[l].v]=true;
Q.push(edge[l].v);
}
}
}
else {
if(dist[edge[l].v]>dist[nowt]+edge[l].w)
{
dist[edge[l].v]=dist[nowt]+edge[l].w;
if(!inque[edge[l].v])
{
inque[edge[l].v]=true;
Q.push(edge[l].v);
}
}
}
}
}
return dist[endd];
}
int main()
{
cin>>T;
while(T--)
{
input();
build_tu();
z=;y=;
while(z<=y)
{
double mid=(z+y)/;
double ans=SPFA(mid);
if(ans>=L) y=mid-0.000001;/*注意这里要加0.000001,之前的二分加1,是为了去一个区间(int),但是现在是double,所以要+0
.000001。*/
else z=mid+0.000001;
}
printf("%0.5lf\n",y);
} return ;
}
二分+最短路判定 BZOJ 2709: [Violet 1]迷宫花园的更多相关文章
- 【二分答案】【Heap-Dijkstra】bzoj2709 [Violet 1]迷宫花园
显然最短路长度随着v的变化是单调的,于是可以二分答案,据说spfa在网格图上表现较差. #include<cstdio> #include<cstring> #include& ...
- bzoj2709: [Violet 1]迷宫花园
二分答案,spfa check就行了. gb题卡精度. #include<cstdio> #include<iostream> #include<cstring> ...
- BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线 (二分+最短路)
题意: 给一个2e4带正边权的图,可以免费k个边,一条路径的花费为路径上边权最大值,问你1到n的最小花费 思路: 对于一个x,我们如果将大于等于x的边权全部免费,那么至少需要免费的边的数量就是 “设大 ...
- 2018.07.20 bzoj1614: Telephone Lines架设电话线(二分+最短路)
传送门 这题直接做显然gg" role="presentation" style="position: relative;">gggg,看这数据 ...
- 二分+最短路 uvalive 3270 Simplified GSM Network(推荐)
// 二分+最短路 uvalive 3270 Simplified GSM Network(推荐) // 题意:已知B(1≤B≤50)个信号站和C(1≤C≤50)座城市的坐标,坐标的绝对值不大于100 ...
- BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1614 分析 类似POJ_3662_Telephone_Lines_(二分+最短路) Dijks ...
- P1462 通往奥格瑞玛的道路 (二分+最短路)
题目 P1462 通往奥格瑞玛的道路 给定\(n\)个点\(m\)条边,每个点上都有点权\(f[i]\),每条边上有边权,找一条道路,使边权和小于给定的数\(b\),并使最大点权最小. 解析 二分一下 ...
- 二分+最短路 UVALive - 4223
题目链接:https://vjudge.net/contest/244167#problem/E 这题做了好久都还是超时,看了博客才发现可以用二分+最短路(dijkstra和spfa都可以),也可以用 ...
- 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)- D. Delivery Delays -二分+最短路+枚举
2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)- D. Delivery Delays -二分+最短路+枚举 ...
随机推荐
- ZeroClipboard – 轻松实现复制文本到剪贴板功能
ZeroClipboard 库提供了一种把文本复制到剪贴板的简单方法.Zero 表示该库是不可见的,用户界面则完全取决于你. 该库完全兼容 Flash Player 10.0.0 或以上版本,这就要求 ...
- Onsen UI – 新鲜出炉的 PhoneGap 界面框架
Onsen UI 是一个基于元素自定义的 HTML5 UI 框架,用于构建你的移动前端.这个一个基于 Web 组件的概念的框架,让构建应用程序变得更加轻松.Onsen UI 专门针对 PhoneGap ...
- 在内网中OWA第一次访问速度慢的问题
当网络环境为内网时,有时访问OWA站点一直卡在Office Web App 那里. 这是因为SharePoint有一个证书需要联网检索 此环境为SharePoint 2013 通过下面的三个步骤 ...
- yii create url (一)
1.$this->redirect这里的$this是当前的controller.可能是应用程序的也 可能是模块下的 这里仅将解一下第一个参能是url,当url是一个字符串时,它会自己动跳转 如$ ...
- clang -rewrite-objc的使用点滴
➠更多技术干货请戳:听云博客 clang -rewrite-objc的作用是把oc代码转写成c/c++代码,我们常用它来窥探OC的一些秘密. 1.最简单的例子 main.m的代码如下: int mai ...
- 【转】超实用的JavaScript技巧及最佳实践
众所周知,JavaScript是一门非常流行的编程语言,开发者用它不仅可以开发出炫丽的Web程序,还可以用它来开发一些移动应用程序(如PhoneGap或Appcelerator),它还有一些服务端实现 ...
- Asp.net Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则 (多级路由) 如:Admin/Test/Index
http://blog.csdn.net/buhuan123/article/details/26387427 目录(?)[-] 1那么我们再来看我们需要的访问方式如下图 razor视图的地址写成通配 ...
- yii2 如何在页面底部加载css和js
作者:白狼 出处:www.manks.top/article/yii2_load_js_css_in_end 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接 ...
- CVEH项目观察与思考
2013-07-01 项目进展: 从启动至今已有三个星期,但是进展甚慢,取得的进展有: A. 封装成库,和HB调用库的接口有些进展,但进未完成 B. 整个框架,类视图,调用视图,只有两三层的进展: C ...
- JavaScript Patterns 6.5 Inheritance by Copying Properties
Shallow copy pattern function extend(parent, child) { var i; child = child || {}; for (i in parent) ...