bzoj2709 [Violet 1]迷宫花园

标签: 二分 最短路
205人阅读 评论(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;
}
查看评论

[BZOJ2709][Violet 1]迷宫花园(二分+spfa)

题目描述传送门题解二分答案+spfa判定代码#include #include #include #include #include #include using namespace std; #de...
  • Clove_unique
  • Clove_unique
  • 2017-03-17 19:16:27
  • 231

【bzoj2709】 迷宫花园 spfa

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

BZOJ2709: [Violet 1]迷宫花园

二分v(上下移动花费)的值,跑最短路验证code:#include #include #include #include #include #include #include #include #in...
  • L_0_Forever_LF
  • L_0_Forever_LF
  • 2017-04-27 08:52:37
  • 222

[BZOJ2709] [Violet 1]迷宫花园

二分+搜索
  • CABI_ZGX
  • CABI_ZGX
  • 2018-02-03 15:54:28
  • 67

bzoj2709 [Violet 1]迷宫花园 二分+spfa

题意:一个矩阵,起点终点固定,有障碍,横向相邻两格的时间固定为1,要求纵向的时间,然后给定L,要求从起点到终点在...
  • qq_35866453
  • qq_35866453
  • 2017-10-20 21:40:51
  • 75

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:13
  • 226

BZOJ2709: [Violet 1]迷宫花园 二分+Spfa

2709: [Violet 1]迷宫花园 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 758  Solved: 264 [Submit...
  • Oakley_
  • Oakley_
  • 2016-08-31 07:10:55
  • 357

[bzoj2709][Violet 1]迷宫花园(二分+spfa)

哇咔咔,今天好冷啊
  • Blue_CuSO4
  • Blue_CuSO4
  • 2017-09-29 07:08:06
  • 97

[bzoj2709][Violet 1]迷宫花园 二分+spfa

2709: [Violet 1]迷宫花园 Time Limit: 5 Sec  Memory Limit: 128 MB [Submit][Status][Discuss] Descript...
  • youhavepeople
  • youhavepeople
  • 2017-10-31 20:42:43
  • 154

[bzoj2709][二分]迷宫花园

Description 普通得甚至有些二逼的矮穷挫少年——Dios,不可避免地遇到了他生命中的劫数,白富 美少女 Nyution。但是按照正常的校园故事的发展,Nyution 是无论...
  • Rose_max
  • Rose_max
  • 2018-02-01 11:00:27
  • 60
    个人资料
    持之以恒
    等级:
    访问量: 7万+
    积分: 2737
    排名: 1万+
    最新评论