• bzoj1295 [SCOI2009]最长距离


    [SCOI2009]最长距离

    Time Limit: 10 Sec Memory Limit: 162 MB

    Description

    windy有一块矩形土地,被分为 NM 块 11 的小格子。 有的格子含有障碍物。 如果从格子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 。


    考虑两个点怎么算联通? 就是说如果路径长度是上面黑点的个数的话。 就看最短路是不是小于等于T就好了。。
    数据范围可以让你疯狂 spfa 为所欲为2333
    ```c++

    include<bits/stdc++.h>

    using namespace std;
    struct lpl{int A, B;};
    int N, M, T;
    double ans;
    int x[] = {0, -1, 0, 1, 0};
    int y[] = {0, 0, 1, 0, -1};
    char mp[35][35];
    int dis[35][35];
    bool vis[35][35];
    queue q;

    inline bool check(int a, int b){
    return (a >= 1 && a <= N && b >= 1 && b <= M);
    }

    inline void spfa(int a, int b){
    memset(dis, 0x3f, sizeof(dis));
    dis[a][b] = (mp[a][b] == '1');
    q.push((lpl){a, b});
    lpl now;
    while(!q.empty()){
    now = q.front(); q.pop();
    vis[now.A][now.B] = false;
    for(int i = 1; i <= 4; ++i)
    if(check(now.A + x[i], now.B + y[i]) && dis[now.A + x[i]][now.B + y[i]] > dis[now.A][now.B] + (mp[now.A + x[i]][now.B + y[i]] == '1')){
    dis[now.A + x[i]][now.B + y[i]] = dis[now.A][now.B] + (mp[now.A + x[i]][now.B + y[i]] == '1');
    if(!vis[now.A + x[i]][now.B + y[i]]){
    vis[now.A + x[i]][now.B + y[i]] = true; q.push((lpl){now.A + x[i], now.B + y[i]});
    }
    }
    }
    }

    inline double sq(double t){
    return t * t;
    }

    inline double Dis(int a1, int b1, int a2, int b2){
    return sqrt(sq(a1 - a2) + sq(b1 - b2));
    }

    inline void calc(int a, int b){
    for(int i = 1; i <= N; ++i)
    for(int j = 1; j <= M; ++j)
    if(dis[i][j] <= T){
    ans = max(ans, Dis(a, b, i, j));
    }
    }

    int main()
    {
    scanf("%d%d%d", &N, &M, &T);
    for(int i = 1; i <= N; ++i) scanf("%s", mp[i] + 1);
    for(int i = 1; i <= N; ++i)
    for(int j = 1; j <= M; ++j){
    spfa(i, j);
    calc(i, j);
    }
    printf("%.6lf", ans);
    return 0;
    }

  • 相关阅读:
    2018徐州网络赛H. Ryuji doesn't want to study
    P3388 【模板】割点
    数列分块入门 1 LOJ6277
    P2261 [CQOI2007]余数求和
    模拟微信小程序页面Page方法
    .Net Newtonsoft.Json 转json时将枚举转为字符串
    .NET CORE 中使用AutoMapper进行对象映射
    .NetMvc从http或本地下载pdf文件
    js给多级复杂动态变量赋值
    微信三方平台开发上传base64格式图片至临时素材
  • 原文地址:https://www.cnblogs.com/LLppdd/p/9892826.html
Copyright © 2020-2023  润新知