求助!#2,#9 TLE

P1462 通往奥格瑞玛的道路

return_CE @ 2022-10-04 18:14:09


#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,cnt;
int f[10010],ans,h[10010];
ll b;
bool v[10010];
struct point 
{
    int nex,to;
    ll pre;
}edg[100020];

priority_queue <pair <ll,int> > q;
int dis[10010];

bool check(int p)
{
    if(p<f[1])return 0;
    while(!q.empty())q.pop();
    memset(dis,0x7f7f7f,sizeof(dis));
    memset(v,0,sizeof(v));

    dis[1]=0;v[1]=1;
    q.push(make_pair(-dis[1],1));
    int root=1;
    for(int i=1;i<n;i++)
    {
        if(v[n])break;
        for(int j=h[root];j;j=edg[j].nex )
        {
            int x=edg[j].to;
            if(f[x]>p||v[x])continue;
            if(dis[root]+edg[j].pre<dis[x])
            {

                dis[x]=dis[root]+edg[j].pre;
                q.push(make_pair(-dis[x],x));
            }
        }
        if(!q.empty())
        {
            while(v[root])
            {
                root=q.top().second;
                q.pop();
            }
            v[root]=1;
        }
    }
    if(dis[n]<=b)return 1;
    else return 0;
}

void add(int x,int y,int z)
{
    edg[++cnt].pre=z;
    edg[cnt].to=y;
    edg[cnt].nex=h[x];
    h[x]=cnt;
}
int main()
{
    cin>>n>>m>>b;
    int maxx=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&f[i]);
        maxx=max(maxx,f[i]);
    }
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);add(y,x,z);
    }
    if(!check(maxx))
    {
        cout<<"AFK";
        return 0;
    }
    int l,r;
    l=1;r=maxx;
    while(l<r)
    {
        int mid=(l+r)>>1;
        if(check(mid))
        {
        //  ans=mid;
            r=mid;
        }
        else l=mid+1;
    }
    cout<<l;
    return 0;
}

/*
4 4 8
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3

10
*/

|