求助玄学TLE/RE
查看原帖
求助玄学TLE/RE
320697
AMIRIOX無暝楼主2022/5/14 19:47

subtask1全TLE了
subtask2全过了

按题面数据范围60%小数据 40%大数据
应该是大范围的数据过了小范围的反而T了

更迷惑的是不开O2是TLE,开了O2就RE

¿

求大佬看看有啥问题

#include <cstdio>
#include <iostream>
#include <queue>
#define int long long
using namespace std;
const int inf = 0x7fffffff;
const int maxn = 1e4 + 10;

int read() {
    int val = 0, f = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-')
            f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        val = (val << 1) + (val << 3) + (c^48);
        c = getchar();
    }
    return val * f;
}
struct edge {
    int to, w, nxt;
    edge() { nxt = -1; }
} Graph[maxn];
int tot, head[maxn];
void addEdge(int u, int to, int w) {
    tot++;
    Graph[tot].to = to;
    Graph[tot].w = w;
    Graph[tot].nxt = head[u];
    head[u] = tot;
}
struct node {
    int pos, val;
    node(int _pos, int _val) : pos(_pos), val(_val) {}
    bool operator<(const node& o) const { return this->val > o.val; }
};
int dis[maxn], f[maxn];
int n, m, b;
bool vis[maxn];
priority_queue<node> q;
bool dijkstra(int lim = inf) {
    for (int i = 1; i <= n; i++) {
        dis[i] = inf;
        vis[i] = false;
    }
    dis[1] = 0;
    if (f[1] > lim) {
        return false;
    }
    q.push(node(1, 0));
    while (!q.empty()) {
        node x = q.top();
        q.pop();
        if (vis[x.pos])
            continue;
        vis[x.pos] = true;
        for (register int i = head[x.pos]; ~i; i = Graph[i].nxt) {
            int y = Graph[i].to;
            int val = Graph[i].w;
            if ((dis[y] > dis[x.pos] + val) && f[y] <= lim) {
                dis[y] = dis[x.pos] + val;
                if (!vis[y])
                    q.push(node(y, dis[y]));
            }
        }
    }
    return dis[n] <= b;
}
signed main() {
    cin >> n >> m >> b;
    for (int i = 1; i <= n; i++) {
        head[i] = -1;
        // scanf("%d", &f[i]);
        f[i] = read();
    }
    for (int i = 1; i <= m; i++) {
        int x, y, w;
        // scanf("%d %d %d", &x, &y, &w);
        x = read();
        y = read();
        w = read();
        addEdge(x, y, w);
        addEdge(y, x, w);
    }
    if (!dijkstra()) {
        printf("AFK\n");
        return 0;
    }
    int l = 0, r = 1e9;
    while (l < r) {
        int mid = l + ((r - l) >> 1);
        if (dijkstra(mid))
            r = mid;
        else
            l = mid + 1;
    }
    printf("%d\n", l);
    return 0;
}

2022/5/14 19:47
加载中...