关闭

bzoj2709 [Violet 1]迷宫花园

标签: 二分最短路
181人阅读 评论(0) 收藏 举报
分类:

题目链接:bzoj2709
题目大意:
就给一个迷宫,#不能走,空格能走,S是起点,E是终点。水平方向的速度恒为1(即走一格所花的时间都为1),而竖直方向的速度v由你来定,使从起点到终点所花的最短时间为L(L是给定的)。

题解:
二分+spfa
下面的范围有说保证0≤v≤10,就直接二分v。
修改竖直方向的边的边权之后跑最短路判定就好了。
诶二分那里好迷。。
这样子就WA了

 double ans,l=0,r=10;
 while(r-l>=eps)
 {
     double mid=(l+r)/2.0;
     spfa(mid);
     if(dis[ed]>L) r=mid-eps;
     else {ans=mid;l=mid+eps;}
}
printf("%.5lf\n",ans);

而这样子是AC的

double ans,l=0,r=10;
while(r-l>=eps)
{
    double mid=(l+r)/2.0;
    spfa(mid);
    if(dis[ed]>L) r=mid-eps;
    else l=mid+eps;
}
printf("%.5lf\n",l);

大概是我不怎么会二分吧。。QwQ
代码里那些奇怪的实际上并不需要的判断是对拍的时候用的。。
并不知道怎么出一定合法的数据。。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 110
#define maxn 10010

const int fx[4]={0,0,1,-1};
const int fy[4]={1,-1,0,0};
const double eps=1e-7;
struct node
{
    int x,y,next;double c;
}a[maxn*4];int len,first[maxn];
int S,E,cnt,num[N][N],ln,ver[maxn*2];
void ins(int x,int y,double c)
{
    len++;a[len].x=x;a[len].y=y;a[len].c=c;
    a[len].next=first[x];first[x]=len;
}
queue<int> q;double d[maxn];bool vis[maxn];
bool spfa()
{
    for (int i=1;i<=cnt;i++) d[i]=-1;
    d[S]=0;vis[S]=true;q.push(S);
    while (!q.empty())
    {
        int x=q.front();q.pop();
        for (int k=first[x];k!=-1;k=a[k].next)
        {
            int y=a[k].y;
            if (d[y]==-1 || d[y]>d[x]+a[k].c)
            {
                d[y]=d[x]+a[k].c;
                if (!vis[y])
                {
                    vis[y]=true;
                    q.push(y);
                }
            }
        }vis[x]=false;
    }
    return d[E]!=-1;
}
bool check(double v)
{
    for (int i=1;i<=ln;i++) a[ver[i]].c=v;
    return spfa();
}
int main()
{
    //freopen("a.in","r",stdin);
    //freopen("a.out","w",stdout);
    int T,n,m,i,j,k;char s[110];
    double lim,ans,l,r;
    scanf("%d",&T);
    while (T--)
    {
        ln=cnt=len=0;
        memset(first,-1,sizeof(first));
        scanf("%lf%d%d\n",&lim,&n,&m);
        for (i=1;i<=n;i++)
        {
            gets(s+1);
            for (j=1;j<=m;j++)
            if (s[j]=='#') num[i][j]=-1;
            else 
            {
                 num[i][j]=++cnt;
                 if (s[j]=='S') S=cnt;
                 else if (s[j]=='E') E=cnt;
            }
        }
        for (i=1;i<=n;i++)
         for (j=1;j<=m;j++)
          if (num[i][j]!=-1)
           for (k=0;k<4;k++)
            if (i+fx[k]>=1 && i+fx[k]<=n && j+fy[k]>=1 && j+fy[k]<=m)
             if (num[i+fx[k]][j+fy[k]]!=-1)
             {
                 ins(num[i][j],num[i+fx[k]][j+fy[k]],1.0);
                 if (k>1) ver[++ln]=len;
             }
        l=0,r=10;
        while(r-l>eps)
        {
            double mid=(l+r)/2.0;
            if (!check(mid)) {l=0;break;}
            if(d[E]>=lim) r=mid;
            else l=mid;
        }
        printf("%.5lf\n",l);
    }
    return 0;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

bzoj 2709: [Violet 1]迷宫花园 (最短路)

2709: [Violet 1]迷宫花园 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 840  Solved: 288 [Submit][St...
  • clover_hxy
  • clover_hxy
  • 2017-03-17 19:05
  • 192

【bzoj2709】 迷宫花园 spfa

好傻逼呀,二分+spfa,没了。 结果数据坑爹,有一行最后有一个空格,坑死了。 #include #include #include #include #include #include #def...
  • u012288458
  • u012288458
  • 2015-09-20 19:36
  • 565

jzoj 3522 迷宫花园

jzoj 3522
  • ssl_lyy
  • ssl_lyy
  • 2017-07-07 15:49
  • 91

jzoj3522 迷宫花园(bfs)

3522. 【NOIP2013模拟11.7B组】迷宫花园(maze)  Description 给定一个一定存在从起点到终点的路径的四联通迷宫。已知Tar左右方向移动的时间为1,上...
  • zhanghaoxian1
  • zhanghaoxian1
  • 2017-07-07 18:20
  • 52

电子老鼠闯迷宫

描述有一只电子老鼠被困在如下图所示的迷宫中。这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部分是路。电子老鼠可以在路上向上、下、左、右行走,每一步走一个格子。现给定一个起点S和一个终点T...
  • Mammon_
  • Mammon_
  • 2016-05-15 01:00
  • 462

读书笔记:CSS禅意花园-布局方法

在介绍布局之前,我们应该先清楚布局的法则,虽然这个是在Web布局之前出现的,但是这里也是延伸了它的规则。     在任何一种以图画作为表达方式的艺术品中,布局的作用都是-有效的组织内容,但是在Web...
  • xiaoyaosanren45
  • xiaoyaosanren45
  • 2014-06-15 22:20
  • 1219

经典迷宫问题1

1.迷宫问题直观感受     下面给出迷宫问题的一个直观感受图,下图中棕色代表通道阻塞,白色代表可用通道,红色代表起始位置,绿色代表当前位置,黄色代表出口。 迷宫1: 迷宫2: ...
  • ghuilee
  • ghuilee
  • 2015-11-27 13:09
  • 1958

简单迷宫问题的求解

回溯法解决迷宫问题
  • qq_33951180
  • qq_33951180
  • 2016-09-11 18:19
  • 907

A*算法求解迷宫

[cpp] view plaincopy #include   #include   #include   using namespace std;  &#...
  • u010944926
  • u010944926
  • 2014-03-06 16:27
  • 1549

淘宝之初:湖畔花园小区里诞生的巨人

2003年4月7日,马云在杭州成立了一个神秘的组织。他叫来十位员工,要他们签了一份协议,这份协议要求他们立刻离开阿里巴巴集 团,去做一个神秘的项目。这个项目要求绝对保密,老马戏称“连说梦话被老婆听到都...
  • aw344
  • aw344
  • 2015-07-23 15:06
  • 968
    个人资料
    • 访问:64854次
    • 积分:2606
    • 等级:
    • 排名:第16154名
    • 原创:200篇
    • 转载:0篇
    • 译文:0篇
    • 评论:30条
    最新评论