30pts求救

P1462 通往奥格瑞玛的道路

Alone0213 @ 2022-10-02 19:31:42

T了#2#3#6#8#9#10,WA了#7看着第二篇题解的思路写的,求调,dij+二分

#include<bits/stdc++.h>
using namespace std;
const int M=5e4+986;
const int N=1e4+576;
const int MV=1e9;
int n,m,b;
struct node{
    int ne,to,w;
}g[M];int cnt;
int h[N];
int fe[N];
int o,p,tr;
int dis[N],vis[N];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;

void add(int s,int t,int val){
    g[++cnt].ne=h[s];
    g[cnt].to=t;
    g[cnt].w=val;
    h[s]=cnt;
}

bool dijkstra(int x){
    if(fe[1]>x) return 0;
    for(int i=1; i<=n; i++){
        dis[i]=0x7fffffff;
        vis[i]=0;
    }
    dis[1]=0;
    q.push(make_pair(dis[1],1));
    while(!q.empty()){
        int u=q.top().second;
        q.pop();
        if(!vis[u]){
            vis[u]=1;
            for(int i=h[u]; i; i=g[i].ne){
                int v=g[i].to;
                if(dis[v]>dis[u]+g[i].w&&fe[v]<=x){
                    dis[v]=dis[u]+g[i].w;
                    q.push(make_pair(dis[v],v));
                }
            }
        }
    }
    if(dis[n]>b) return 0;
    return 1;
}
signed main(){
    scanf("%d%d%d",&n,&m,&b);
    for(int i=1; i<=n; i++) scanf("%d",&fe[i]);
    for(int i=1; i<=m; i++){
        scanf("%d%d%d",&o,&p,&tr);
        add(o,p,tr);
        add(p,o,tr);
    }
    if(!dijkstra(MV)) return 0&printf("AFK");
    int l=1,r=MV,mid=(l+r)>>1;
    while(l<=r){
        bool whe=dijkstra(mid);
        if(whe){
            r=mid-1;
            mid=(l+r)>>1;
        }else{
            l=mid+1;
            mid=(l+r)>>1;
        }
    }
    printf("%d",l);
    return 0;
}

|