• 【BZOJ1295】最短路


    分析
    这题没啥难度。
    可以删除最多T个点,意思就是两点之间最多有T个障碍,意思就是没有障碍权值是0,有障碍权值是1,意思就是两点之间的最短路<=T即可行。

    然后枚举点统计答案。

    #include <bits/stdc++.h>
    #define sc(n) scanf("%d",&n)
    #define pt(n) printf("%d ",n)
    #define rep(i,a,b) for(int i=a;i<=b;i++)
    #define vi vector<int>
    #define vl vector<long long>
    #define pb push_back
    #define INF 0x3f3f3f3f
    using namespace std;
    const int maxn = 50;
    typedef pair<int,int> P;
    int dx[]={1,-1,0,0};
    int dy[]={0,0,1,-1};
    int G[maxn][maxn];
    int n,m,t;
    int dis[maxn][maxn];
    int inq[maxn][maxn];
    double ans = 0;
    void getans(int x,int y)
    {
    for(int i=1;i<=n;i++)
    {
    for(int j=1;j<=m;j++)
    {
    if(dis[i][j]<=t && ans<sqrt((i-x)*(i-x)+(j-y)*(j-y)))
    {
    ans = sqrt((i-x)*(i-x)+(j-y)*(j-y));
    }
    }
    }
    }
    void spfa(int x,int y)
    {
    memset(dis,INF,sizeof(dis));
    memset(inq,0,sizeof(inq));
    queue<P> q;
    dis[x][y] = G[x][y];
    q.push(P(x,y));
    inq[x][y] = 1;
    while(!q.empty())
    {
    P tmp = q.front();
    q.pop();
    inq[tmp.first][tmp.second] = 0;
    for(int i=0;i<4;i++)
    {
    int nx = tmp.first+dx[i];
    int ny = tmp.second+dy[i];
    if(nx>=1 && nx<=n && ny>=1 && ny<=m)
    {
    if(dis[nx][ny]>dis[tmp.first][tmp.second]+G[nx][ny])
    {
    dis[nx][ny] = dis[tmp.first][tmp.second]+G[nx][ny];
    if(!inq[nx][ny])
    {
    q.push(P(nx,ny));
    }
    }
    }
    }
    }
    getans(x,y);
    }
    int main(http://www.my516.com)
    {
    scanf("%d%d%d",&n,&m,&t);
    for(int i=1;i<=n;i++)
    {
    for(int j=1;j<=m;j++)
    {
    char ch;
    cin>>ch;
    if(ch=='1') G[i][j] = 1;
    }
    }
    for(int i=1;i<=n;i++)
    {
    for(int j=1;j<=m;j++)
    {
    spfa(i,j);
    }
    }
    printf("%.6lf ",ans);
    return 0;
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86

    ---------------------

  • 相关阅读:
    数据--第53课
    数据--第52课
    数据--第51课
    标准模板库中的优先队列(priority_queue)
    进程的定义
    进程的基本概念
    循环不变式
    插入排序
    模板声明
    标准模板库中的队列(queue)
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11109102.html
Copyright © 2020-2023  润新知