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

 /*
分析:符合二分的原理:当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]迷宫花园的更多相关文章

  1. 【二分答案】【Heap-Dijkstra】bzoj2709 [Violet 1]迷宫花园

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

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

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

  3. BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线 (二分+最短路)

    题意: 给一个2e4带正边权的图,可以免费k个边,一条路径的花费为路径上边权最大值,问你1到n的最小花费 思路: 对于一个x,我们如果将大于等于x的边权全部免费,那么至少需要免费的边的数量就是 “设大 ...

  4. 2018.07.20 bzoj1614: Telephone Lines架设电话线(二分+最短路)

    传送门 这题直接做显然gg" role="presentation" style="position: relative;">gggg,看这数据 ...

  5. 二分+最短路 uvalive 3270 Simplified GSM Network(推荐)

    // 二分+最短路 uvalive 3270 Simplified GSM Network(推荐) // 题意:已知B(1≤B≤50)个信号站和C(1≤C≤50)座城市的坐标,坐标的绝对值不大于100 ...

  6. BZOJ_1614_ [Usaco2007_Jan]_Telephone_Lines_架设电话线_(二分+最短路_Dijkstra/Spfa)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1614 分析 类似POJ_3662_Telephone_Lines_(二分+最短路) Dijks ...

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

    题目 P1462 通往奥格瑞玛的道路 给定\(n\)个点\(m\)条边,每个点上都有点权\(f[i]\),每条边上有边权,找一条道路,使边权和小于给定的数\(b\),并使最大点权最小. 解析 二分一下 ...

  8. 二分+最短路 UVALive - 4223

    题目链接:https://vjudge.net/contest/244167#problem/E 这题做了好久都还是超时,看了博客才发现可以用二分+最短路(dijkstra和spfa都可以),也可以用 ...

  9. 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 -二分+最短路+枚举 ...

随机推荐

  1. sDashboard:简单的,轻量级的 jQuery 仪表板插件

    sDashboard 是一个轻量的仪表板 jQuery 插件,转换一个对象数组到仪表板.数组中的每个对象将被呈现为一个仪表板组件,可以通过左右拖 ​动重新排列. sDashboards 内置渲染 Da ...

  2. Hexo - 快速,轻量,强大的 Node.js 博客框架

    Hexo 是一个快速,轻量,强大的 Node.js 博客框架.带给你难以置信的编译速度,瞬间生成静态文件:支持 Markdown,甚至可以在 Hexo 中集合 Octopress 插件:只需要一个命令 ...

  3. 分享50款 Android 移动应用程序图标【上篇】

    在这个移动程序流行的时代,持续增长的应用程序经济充满了商业机遇.任何对应用程序设计感兴趣的人,将会喜欢上这里的50个独特的 Android 应用程序图标.这些例子中的图标能够让应用程序的设计更具吸引力 ...

  4. windows10 网络热点

    (1)快捷键 :win + x (2)判断自己的电脑是否支持无线接口,输入以下命令,会出现提示是否支持无线接口,如果不支持,请不要往下看了.. netsh wlan show drivers (3)若 ...

  5. Vue数据绑定隐藏的神坑....

    今天被Vue的一个坑给折磨了一天,终于发现是什么问题,我们先来模拟一个场景: 代码如下: <!DOCTYPE html> <html lang="en"> ...

  6. SharePoint 2013 – Workflow Manager 1.0 offline download

    [http://sharepointdeal.wordpress.com/2013/03/13/sharepoint-2013-workflow-manager-1-0-offline-downloa ...

  7. ReflectUitls类的编写和对反射机制的解析

    ReflectUitls类的编写和对反射机制的解析 反射相关的类 反射相关的类,最基本的当然是Class类. 获取了Class对象之后,就可以接着生成对象实例.调用方法.查看字段等等. 字段(Fiel ...

  8. 转载:设置html页面不让浏览器缓存的方法

    本文是转载文章,只是方便自己记录. 在html页面head标签之间添加以下标识可以避免大多数浏览器缓存: <meta http-equiv="Pragma" content= ...

  9. apache 日志轮询 linux cronolog

    Linux下运行的Web服务器Apache,默认日志文件是不分割的,一个整文件既不易于管理,也不易于分析统计.安装cronolog后,可以将日志文件按时间分割,易于管理和分析. cronolog安装配 ...

  10. gitlab+gerrit+jenkins持续集成框架

    1.持续集成之gitlab+gerrit+jenkins 1.1. GitLab 1.1.1. 简介 GitLab 是一个使用使用Ruby on Rails搭建的,用于仓库管理系统的开源项目.使用Gi ...