样例过了,但全部WA,有大佬能看出我是在哪里出了问题吗

P1462 通往奥格瑞玛的道路

Lycdeer @ 2024-08-25 23:12:35

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
const int M=5e4+5;
const long long INF=1e15;
int n,m,b_v;
pair<long long,int> pr;
long long f[N];
int h[N],nxt[M],to[M],cnt;
long long val[M],dis[M];
bool vis[N];
struct node{
    long long val;
    int num;
}p[N];
bool cmp(node a,node b){
    return a.val<b.val;
}
void add(int x,int y,int z){
    to[++cnt]=y;
    val[cnt]=z;
    nxt[cnt]=h[x];
    h[x]++;
}
priority_queue<pair<long long,int> > q;
bool Dijkstra(long long tp){
    fill(dis+1,dis+n+1,INF);
    fill(vis+1,vis+n+1,0);
    dis[1]=0;
    pr.first=dis[1];
    pr.second=1;
    q.push(pr);
    while(q.size()){
        pr=q.top(); q.pop();
        int u=pr.second;
        vis[u]=1;
        for(int i=h[u];i;i=nxt[i]){
            int v=to[i];
            long long w=val[i];
            if(vis[v]) continue;
            if(f[v]>tp) continue;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                pr.first=dis[v];
                pr.second=v;
                q.push(pr);
            }
        }
    }
    long long sum=0;
    for(int i=2;i<=n-1;i++){
        sum+=dis[i];
        if(sum>b_v) return 0;
    }
    return 1;
}
int main(){
    cin>>n>>m>>b_v;
    for(int i=1;i<=n;i++){
        cin>>f[i];
        p[i].val=f[i];
        p[i].num=i;
    }
    sort(p+1,p+n+1,cmp);
    for(int i=1,a,b,c;i<=m;i++){
        cin>>a>>b>>c;
        add(a,b,c); add(b,a,c);
    }
    int l=2,r=n-1;
    while(l<=r){
        int mid=(l+r)/2;
        if(Dijkstra(p[mid].val)) r=mid-1;
        else l=mid+1;
    }
    cout<<f[l];
    return 0;
}

by Archy_ @ 2024-08-28 18:53:20

优先队列默认是把大的值放到顶,Dij需要把小的放上面,不知道是不是这个问题


|