bzoj2709 [Violet 1]迷宫花园

原创 2017年04月06日 10:13:00

题目链接: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

2709: [Violet 1]迷宫花园 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 758  Solved: 264 [Submit...

BZOJ 2716 [Violet 3]天使玩偶 KDtree

以下引用自“‎Alboi_真神名曰驴蛋蛋”对于一颗普通的K-D树,让K-D树上每个节点记录它这颗子树的大小(size)和这颗子树所能延伸到的最大横坐标,最小横坐标,最大纵坐标,最小纵坐标......就...

BZOJ2724: [Violet 6]蒲公英

裸的分块 不知道可以去看clj写的区间众数 感觉自己常数很大代码也丑的不行。。。 #include #include #include #include #include #in...

【BZOJ】【P2724】【Violet 6】【蒲公英】【题解】【分块】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2724 区间众数,分

【BZOJ 2724】 [Violet 6]蒲公英

分块在线求区间众数~

BZOJ 2711: [Violet 2]After 17

Description Input Output Sample Input 4 4 5 1 2 3 3 4 1 Sample Output...

BZOJ 2648 SJY摆棋子 / 2716 Violet 3 天使玩偶 K-D树

题目大意:平面上有一些点,问一个点周围离它最近的点的曼哈顿距离是多少。支持动态加点。 思路:CDQ分治可以离线解决,但是SJY是卡CDQ的,天使玩偶可以过。毕竟K-D树的O(sqrt(n))的时间...

【Violet3】【BZOJ2716】天使玩偶

Description Input Output Sample Input Sample Output HINT Source在题面里放大样例…我该说Vani良心? 样例...

【Violet 6】【BZOJ2724】蒲公英

Description Input 修正一下l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 Output Samp...

模拟赛 银河之星(即BZOJ 2719: [Violet 4]银河之星)

Time Limit: 5 Sec  Memory Limit: 128 MB
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)