30pts求条
查看原帖
30pts求条
776799
GODTREE楼主2025/7/30 17:18
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,b,l,r,mid;
int cnt;
const int N=5e4+5,inf=1e15;
struct edge
{
    int from,to,nxt,val;
}g[N];
int d[N],h[N],f[N];
void add(int u,int v,int w)
{
    g[++cnt].from=u;
    g[cnt].to=v;
    g[cnt].nxt=h[u];
    g[cnt].val=w;
    h[u]=cnt;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
void dij(int maxn)
{
    for (int i=1;i<=n;i++)
    {
        d[i]=inf;
    }
    d[1]=0;
    q.push({0,1});
    while(!q.empty())
    {
        int u=q.top().second;
        q.pop();
        for (int i=h[u];~i;i=g[i].nxt)
        {
            int v=g[i].to;
            int len=g[i].val;
            if (f[v]>maxn)
            {
                continue ;
            }
            if (d[u]+len<d[v])
            {
                d[v]=d[u]+len;
                q.push({d[v],v});
            }
        }
    }
}
signed main()
{
    cin>>n>>m>>b;
    for (int i=1;i<=n;i++)
    {
        h[i]=-1;
        cin>>f[i];
        r=max(r,f[i]);
    }
    l=max(f[1],f[n]);
    for (int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,w);
    }
    while(l<r)
    {
        mid=(l+r)/2;
        dij(mid);
        if (d[n]>b)
            l=mid+1;
        else
            r=mid;
    }
    dij(l);
    if (d[n]>b) cout<<"AFK";
    else cout<<l;
    return 0;
}

2025/7/30 17:18
加载中...