松鼠回家(最短路+二分)

D-松鼠回家_2023河南萌新联赛第(一)场:河南农业大学 (nowcoder.com)

松鼠回家(最短路+二分)_第1张图片

 

#include
using namespace std;
#define int long long
const int N=2e5+10;
mapa;
int n,m,st,ed,h;
struct node{
    int x,y;
};
vectorhh[N];
int dis[N],vis[N];
struct cmp{
    bool operator()(const node &a,const node &b){
        return a.y,cmp >q;
    q.push({st,0});
    dis[st]=0;
    while(q.size()){
        node now=q.top();
        q.pop();
        int st=now.x;
        if(a[st]>k)continue;
        if(vis[st])continue;
        vis[st]=1;
        for(auto it:hh[st]){
            if(a[it.x]>k)continue;
            if(dis[it.x]>dis[st]+it.y){
                dis[it.x]=dis[st]+it.y;
                q.push({it.x,dis[it.x]});
            }
        }
    }
}
bool check(int mid){
    dij(mid);
    if(dis[ed]-dis[st]<=h)return 1;
    else return 0;
}
signed main(){
    cin>>n>>m>>st>>ed>>h;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    while(m--){
        int x,y,z;
        cin>>x>>y>>z;
        hh[x].push_back({y,z});
        hh[y].push_back({x,z});
    }
    int l=max(a[st],a[ed]),r=1e7+10;
    while(l<=r){
        int mid=(l+r)/2;
        if(check(mid))r=mid-1;
        else l=mid+1;
    }
    if(check(l)==0)cout<<"-1"<

你可能感兴趣的:(比赛错题集,算法,c++)