蒟蒻萌新wa了两个点 求大佬调
查看原帖
蒟蒻萌新wa了两个点 求大佬调
936693
YangMieMie_楼主2023/8/24 20:43
#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define int long long
#define xx first
#define yy second
typedef pair<int, int> PII;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int N = 1e5 + 10;

int f[N], n, m, k, x, T;
int w[N], e[N], ne[N], idx, h[N];
int l, r, dis[N], vis[N];
priority_queue<PII, vector<PII>, greater<PII>> q;
void add(int a, int b, int c)
{
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}
void dijkstra(int maxn)
{
    for (int i = 1; i <= n; i++)
    {
        dis[i] = inf;
        vis[i] = 0;
    }
    dis[1] = 0;
    while (q.size())
        q.pop();
    q.push({dis[1], 1});
    while (q.size())
    {
        auto t = q.top();
        q.pop();
        int u = q.top().yy;
        if (vis[u])
            continue;
        vis[u] = 1;
        for (int i = h[u]; ~i; i = ne[i])
        {
            int j = e[i];
            if (f[j] > maxn)
                continue;
            if (dis[j] > w[i] + dis[u])
            {
                dis[j] = w[i] + dis[u];
                q.push({dis[j], j});
            }
        }
    }
}
signed main()
{
    int b;
    memset(h, -1, sizeof h);
    cin >> n >> m >> b;
    for (int i = 1; i <= n; i++)
    {
        cin >> f[i];
        r = max(r, f[i]);
    }
    l = max(f[1], f[n]);
    for (int i = 1; i <= m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c), add(b, a, c);
    }
    while (l < r)
    {
        int mid = (l + r) >> 1;
        dijkstra(mid);
        if (dis[n] > b)
            l = mid + 1; // 怕死循环
        else
            r = mid;
    }
    dijkstra(l);
    if (dis[n] > b)
        printf("AFK\n");
    else
        printf("%lld\n", l);
    return 0;
}
2023/8/24 20:43
加载中...