100pts求调教 WA#1 #14
查看原帖
100pts求调教 WA#1 #14
1383823
Cute_Elaina楼主2025/7/18 20:36
#include <bits/stdc++.h>
#define ll long long
#define N 200001
#define mod 998244353
#define all(a) a.begin(),a.end()
#define uniqueu(a) a.erase(unique(all(a)), a.end())
using namespace std;
mt19937_64 mrand(random_device{}());

struct Edge {
    int w, v;
    Edge (int w_, int v_) {
        w = w_; v = v_;
    }
};

struct Info {
    int id, w;
    bool operator < (const Info &A) const {
        return A.w < w;
    }
};

vector<Edge> edges[N];
int n, m, k;
ll f[N], dist[N];
bool b[N];

bool check(ll p) {
    priority_queue<Info> q;
    memset(dist, 127, sizeof(dist));
    q.push((Info){1, 0});
    dist[1] = 0;
    for ( ; !q.empty(); ) {
        auto x = q.top();
        q.pop();
        int u = x.id;
        if (dist[u] != x.w)
            continue;
        for (auto &i : edges[u])
            if (f[i.w] <= p && dist[i.w] > dist[u] + i.v) {
                dist[i.w] = dist[u] + i.v;
                q.push((Info){i.w, dist[i.w]});
            }
    }
    return dist[n] <= k;
}

int main() {
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= n; i++)
        scanf("%lld", &f[i]);
    for (int i = 1; i <= m; i++) {
        int x, y; ll v;
        scanf("%d%d%lld", &x, &y, &v);
        edges[x].push_back(Edge(y, v));
        edges[y].push_back(Edge(x, v));
    }
    if (!check(1000000001)) {
        puts("AFK");
        return 0;
    }
    ll L = 0, R = 1e18 + 1;
    for ( ; L + 1 < R; ) {
        ll Mid = (L + R) / 2;
        if (!check(Mid))
            L = Mid;
        else
            R = Mid;
    }
    if (!check(R))
        puts("AFK");
    else
        printf("%lld\n", R);
}
2025/7/18 20:36
加载中...