#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<queue>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
typedef long long ll;
const int MAXN=100000+10;
const int MAXM=500000+10;
ll n,m,u,v,s;
ll f[MAXN],vi[MAXN];
ll len=0,last[MAXN];
ll dis[MAXN];
bool vis[MAXN];
struct edge{
ll to,val,next;
}e[MAXN*2];
void add(ll from,ll to,ll val){
e[++len]=(edge){to,val,last[from]};
last[from]=len;
}
bool check(int mid){
deque<long long>q;
memset(vis,0,sizeof(vis));
memset(dis,63,sizeof(dis));
if(vi[u]<=f[mid]) q.push_front(u);
else return 0;
vis[u]=1;dis[u]=0;
while(!q.empty()){
int cur=q.front(); q.pop_front();
vis[cur]=0;
for(ll i=last[cur];i;i=e[i].next){
int id=e[i].to;
if(vi[id]<=f[mid]){
if(dis[id]>dis[cur]+e[i].val){
dis[id]=dis[cur]+e[i].val;
if(!vis[id]){
vis[id]=1;
if(!q.empty()){
if(dis[id]>dis[q.front()]) q.push_back(id);
else q.push_front(id);
}
else q.push_front(id);
}
}
}
}
}
if(dis[v]<s) return 1;
else return 0;
}
int main(){
scanf("%lld%lld%lld%lld%lld",&n,&m,&u,&v,&s);
fo(i,1,n) {
scanf("%lld",&f[i]);
vi[i]=f[i];
}
sort(f+1,f+1+n);
ll x,y,z;
fo(i,1,m){
scanf("%lld%lld%lld",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
ll l=1,r=n,ans=1e12;
while(l<=r){
ll mid=(l+r)/2;
if(check(mid)){
ans=min(ans,f[mid]);
r=mid-1;
}
else l=mid+1;
}
if(ans==1e12) printf("-1");
else printf("%lld",ans);
return 0;
}
codevs 4175 二分+spfa判断
最新推荐文章于 2022-07-15 02:16:05 发布