警醒zz的自己

本文介绍了一种结合二分查找与迪杰斯特拉最短路径算法的优化方案,用于解决特定条件下的路径寻找问题。该算法适用于图中带有阈值限制的情况,并通过优先队列实现堆优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P1462 通往奥格瑞玛的道路
二分 迪杰斯特拉 最短路
堆优化的时候扔进去{dis[e[i].v],e[i].v}

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
typedef pair<int,int > pii;
typedef double db;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define per(i,s,t) for(int i=s;i>=t;i--)
#define ms0(ar) memset(ar,0,sizeof ar)
#define ms1(ar) memset(ar,-1,sizeof ar)
#define Ri(x) scanf("%d",&x)
#define Rii(x,y) scanf("%d%d",&x,&y)

#define Riii(x,y,z) scanf("%d%d%d",&x,&y,&z)

const int INF=0x3f3f3f3f;
const int N=1e5+10,M=1e4+10;
struct node{
	int u,v,w,ne;
}e[N];
int n,m,bx[M],cx[M],h[M],dis[M],idx,hp;
bool vis[M];

priority_queue<pii,vector<pii>,greater<pii> > q;

void add(int a,int b,int c){
    idx++;
    e[idx].u=a;
    e[idx].v=b;
    e[idx].w=c;
    e[idx].ne=h[a];
    h[a]=idx;
    return;
}
bool dj(int x){
	if(x<bx[1]||x<bx[n])return false;//必定经过 1 n 
	memset(dis,0x3f,sizeof dis);
	rep(i,1,n)
        if(bx[i]>x) vis[i]=1;
        else vis[i]=0;
	dis[1]=0; q.push({0,1});
	
	while(!q.empty()){
        pii tx=q.top();
        q.pop();
        int t=tx.second;
        if(vis[t]) continue;
        vis[t]=true;
        for(int i=h[t];i;i=e[i].ne)
            if(dis[e[i].v]>e[i].w+dis[t]){
                dis[e[i].v]=e[i].w+dis[t];
                q.push({dis[e[i].v],e[i].v});
			}
		}
	if(dis[n]<=hp)return 1;
    else return 0;
	
}
int main(){
	int ans=0;
    Riii(n,m,hp);
    rep(i,1,n){
        Ri(bx[i]);
        cx[i]=bx[i];
	}
	int a,b,c;
    rep(i,1,m){
        Riii(a,b,c);
        if(a==b)continue;
        add(a,b,c);
        add(b,a,c);
	}
    sort(cx+1,cx+n+1);
    int l=1,r=n,mid;
    
    if(!dj(cx[n])){
        printf("AFK\n");
		return 0;
	}
    ans=cx[n];
    while(l<r){
        mid=(l+r)>>1;
        if(dj(cx[mid])){
            ans=cx[mid];
            r=mid;
		}
        else l=mid+1;
	}
    printf("%d\n",ans);
    
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值