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;
}