UOJ Logo zhouyuheng2009的博客

博客

求助#771

2021-09-17 03:26:44 By zhouyuheng2009

dijkstra+二分,应该是正解...

但神秘挂成30,调不出来了 QwQ

#include <bits/stdc++.h>

const int Maxn = 105;
const int eps = 1e-5; 

int n, m;
int sx, sy, tx, ty;
bool maps[Maxn][Maxn];
double s;

bool vis[Maxn][Maxn];
double dis[Maxn][Maxn];
int d[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
double ans;

struct node {
    int x, y;
    double dist;
    friend bool operator < (const node a, const node b) {
        return a.dist > b.dist; 
    }
};
std::priority_queue<node> q; 

double dijkstra(int sx, int sy, int tx, int ty, double k) {
    int i, j;
    dis[sx][sy] = 0;
    q.push({sx, sy, 0});
    while (!q.empty()) {
        node u = q.top(); q.pop();
        if (vis[u.x][u.y] == 1) continue;
        vis[u.x][u.y] = 1; 
        for (i = 0; i < 4; i++) {
            node v = {u.x + d[i][0], u.y + d[i][1], u.dist + ((i == 1 || i == 3) ? k : 1.0)};
            if (v.x >= 1 && v.x <= n && v.y >= 1 && v.y <= m) {
                if (maps[v.x][v.y] == 0) {
                    if (dis[v.x][v.y] > v.dist) {
                        dis[v.x][v.y] = v.dist;
                        q.push(v); 
                    }
                }
            }
        }
    }
    return dis[tx][ty]; 
}

double check(double k) {
    int i, j; 
    memset(vis, 0, sizeof(vis));
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= m; j++) {
            dis[i][j] = 1e15 + 7; 
        }
    }
    while (!q.empty()) q.pop(); 
    return dijkstra(sx, sy, tx, ty, k); 
}

int main() {
    int i, j;
    scanf("%d %d", &n, &m);
    scanf("%d %d %d %d", &sx, &sy, &tx, &ty);
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= m; j++) {
            scanf("%d", &maps[i][j]);
        }
    }
    scanf("%lf", &s);
    double l = 0, r = s;
    while (l + eps < r) {
        double mid = (l + r) / 2;
        double tmp = check(mid);
        if (tmp == s) {
            ans = mid;
            break; 
        }
        else if (tmp < s) l = mid; 
        else r = mid; 
    }
    printf("%.3lf\n", ans); 
    return 0; 
}
/*
4 4
1 1 4 4
0 0 1 1
1 0 0 0
0 0 1 0
0 0 0 0
5.00
 */

评论

zhouyuheng2009
@Reliauk
Reliauk
@zzzYheng
ClHg2
@Reliauk @zzzYheng
Reliauk
@zzzYheng 怎么不打联考

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。