Alone0213 @ 2022-10-02 19:31:42
T了#2#3#6#8#9#10,WA了#7看着第二篇题解的思路写的,求调,dij+二分
#include<bits/stdc++.h>
using namespace std;
const int M=5e4+986;
const int N=1e4+576;
const int MV=1e9;
int n,m,b;
struct node{
int ne,to,w;
}g[M];int cnt;
int h[N];
int fe[N];
int o,p,tr;
int dis[N],vis[N];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
void add(int s,int t,int val){
g[++cnt].ne=h[s];
g[cnt].to=t;
g[cnt].w=val;
h[s]=cnt;
}
bool dijkstra(int x){
if(fe[1]>x) return 0;
for(int i=1; i<=n; i++){
dis[i]=0x7fffffff;
vis[i]=0;
}
dis[1]=0;
q.push(make_pair(dis[1],1));
while(!q.empty()){
int u=q.top().second;
q.pop();
if(!vis[u]){
vis[u]=1;
for(int i=h[u]; i; i=g[i].ne){
int v=g[i].to;
if(dis[v]>dis[u]+g[i].w&&fe[v]<=x){
dis[v]=dis[u]+g[i].w;
q.push(make_pair(dis[v],v));
}
}
}
}
if(dis[n]>b) return 0;
return 1;
}
signed main(){
scanf("%d%d%d",&n,&m,&b);
for(int i=1; i<=n; i++) scanf("%d",&fe[i]);
for(int i=1; i<=m; i++){
scanf("%d%d%d",&o,&p,&tr);
add(o,p,tr);
add(p,o,tr);
}
if(!dijkstra(MV)) return 0&printf("AFK");
int l=1,r=MV,mid=(l+r)>>1;
while(l<=r){
bool whe=dijkstra(mid);
if(whe){
r=mid-1;
mid=(l+r)>>1;
}else{
l=mid+1;
mid=(l+r)>>1;
}
}
printf("%d",l);
return 0;
}