• [SCOI2009][BZOJ1295] 最长距离


    1295: [SCOI2009]最长距离

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 1018  Solved: 538
    [Submit][Status][Discuss]

    Description

    windy有一块矩形土地,被分为 N*M 块 1*1 的小格子。 有的格子含有障碍物。 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离。 如果从格子A不可以走到格子B,就没有距离。 如果格子X和格子Y有公共边,并且X和Y均不含有障碍物,就可以从X走到Y。 如果windy可以移走T块障碍物,求所有格子间的最大距离。 保证移走T块障碍物以后,至少有一个格子不含有障碍物。

    Input

    输入文件maxlength.in第一行包含三个整数,N M T。 接下来有N行,每行一个长度为M的字符串,'0'表示空格子,'1'表示该格子含有障碍物。

    Output

    输出文件maxlength.out包含一个浮点数,保留6位小数。

    Sample Input

    【输入样例一】
    3 3 0
    001
    001
    110


    【输入样例二】
    4 3 0
    001
    001
    011
    000


    【输入样例三】
    3 3 1
    001
    001
    001

    Sample Output

    【输出样例一】
    1.414214

    【输出样例二】
    3.605551

    【输出样例三】
    2.828427

    HINT

    20%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 0 。
    40%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 2 。
    100%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 30

     
    暴力SPFA……
    从每个点开始做一遍SPFA,求出任意两点之间相互到达需要经过的最少障碍数。然后判断是否小于或等于T,否则不可行。然后求出可行方案的最大距离。
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<vector>
    #define MOD 49999
    #define INF 100000007
    using namespace std;
    double ans;
    char s[31][31];
    bool v[909];
    int dx[5]={0,-1,0,1,0};
    int dy[5]={0,0,-1,0,1};
    int n,m,t,tot,edge,num[31][31],map[909][909],dis[909],q[50000],next[50000],head[909],list[50000],key[50000];
    void insert(int x,int y,int z)
    {
        next[++edge]=head[x];
        head[x]=edge;
        list[edge]=y;
        key[edge]=z;
    }
    void build()
    {
        int xx,yy;
        for (int i=1;i<=n;i++)
            for (int j=1;j<=m;j++)
                for (int k=1;k<=4;k++)
                {
                    xx=i+dx[k];
                    yy=j+dy[k];
                    if (xx<1||xx>n||yy<1||yy>m) continue;
                    if (s[xx][yy-1]=='1') insert(num[i][j],num[xx][yy],1); 
                    else insert(num[i][j],num[xx][yy],0);
                }
    }
    void spfa(int sx,int sy)
    {
        for (int i=1;i<=tot;i++) dis[i]=INF;
        memset(v,0,sizeof(v));
        v[num[sx][sy]]=1;
        dis[num[sx][sy]]=0;
        int x,t=0,w=1;q[1]=num[sx][sy];
        while (t!=w)
        {
            t=(t+1)%MOD;
            x=q[t];
            for (int i=head[x];i;i=next[i])
                if (dis[x]+key[i]<dis[list[i]])
                {
                    dis[list[i]]=dis[x]+key[i];
                    if (!v[list[i]])
                    {    
                        w=(w+1)%MOD;
                        q[w]=list[i];
                        v[list[i]]=1;
                    }
                }
            v[x]=0;
        }
        for (int i=1;i<=tot;i++) map[num[sx][sy]][i]=dis[i];
    }    
    double calc(int x,int y)
    {
        int x1,x2,y1,y2,sum;
        x1=(x-1)/m+1; y1=(x-1)%m+1;
        x2=(y-1)/m+1; y2=(y-1)%m+1;
        sum=(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
        return sqrt(double(sum));
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&t);
        for (int i=1;i<=n;i++)
            scanf("%s",s[i]);
        tot=0; edge=0;
        for (int i=1;i<=n;i++)
             for (int j=1;j<=m;j++) 
                 num[i][j]=++tot;
         build();
         for (int i=1;i<=n;i++)
             for (int j=1;j<=m;j++)
                 spfa(i,j);
         for (int i=1;i<=tot;i++) 
             for (int j=1;j<=tot;j++)
             {
                int x1=(i-1)/m+1,y1=(i-1)%m+1;
                if (map[i][j]<=t-(s[x1][y1-1]=='1'))
                {
                    double x=calc(i,j);
                    ans=max(ans,x);
                }
            }
        printf("%.6lf",ans);
        return 0;
    }

    TYVJ上直接全部输出-0.00000 …… 0msWA……八中A了

  • 相关阅读:
    Dicom文件转mhd,raw文件格式
    李宏毅机器学习笔记6:Why deep、Semi-supervised
    李宏毅机器学习笔记5:CNN卷积神经网络
    Oracle数据库类型总结
    Oracle数据库连接生成DataX的job-Json
    [JavaWeb基础] 030.dom4j读取xml的4种方法
    [JavaWeb基础] 029.OGNL表达式介绍
    eatwhatApp开发实战(五)
    [Axure教程]0005.系统函数与变量介绍
    eatwhatApp开发实战(四)
  • 原文地址:https://www.cnblogs.com/ws-fqk/p/4646525.html
Copyright © 2020-2023  润新知