zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    那些年 IE 下踩过的坑
    nodeJs的一些常识知识
    通过nvm 切换 npm 版本
    Kafka学习笔记(7)----Kafka使用Cosumer接收消息
    Kafka学习笔记(6)----Kafka使用Producer发送消息
    Kafka学习笔记(5)----Kafka的Consumer
    Kafka学习笔记(4)----Kafka的Leader Election
    Kafka学习笔记(3)----Kafka的数据复制(Replica)与Failover
    Kafka学习笔记(2)----Kafka的架构
    Kafka学习笔记(1)----Kafka的简介和Linux下单机安装
  • 原文地址:https://www.cnblogs.com/LLppdd/p/9892826.html
Copyright © 2011-2022 走看看