Lycdeer @ 2024-08-25 23:12:35
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
const int M=5e4+5;
const long long INF=1e15;
int n,m,b_v;
pair<long long,int> pr;
long long f[N];
int h[N],nxt[M],to[M],cnt;
long long val[M],dis[M];
bool vis[N];
struct node{
long long val;
int num;
}p[N];
bool cmp(node a,node b){
return a.val<b.val;
}
void add(int x,int y,int z){
to[++cnt]=y;
val[cnt]=z;
nxt[cnt]=h[x];
h[x]++;
}
priority_queue<pair<long long,int> > q;
bool Dijkstra(long long tp){
fill(dis+1,dis+n+1,INF);
fill(vis+1,vis+n+1,0);
dis[1]=0;
pr.first=dis[1];
pr.second=1;
q.push(pr);
while(q.size()){
pr=q.top(); q.pop();
int u=pr.second;
vis[u]=1;
for(int i=h[u];i;i=nxt[i]){
int v=to[i];
long long w=val[i];
if(vis[v]) continue;
if(f[v]>tp) continue;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
pr.first=dis[v];
pr.second=v;
q.push(pr);
}
}
}
long long sum=0;
for(int i=2;i<=n-1;i++){
sum+=dis[i];
if(sum>b_v) return 0;
}
return 1;
}
int main(){
cin>>n>>m>>b_v;
for(int i=1;i<=n;i++){
cin>>f[i];
p[i].val=f[i];
p[i].num=i;
}
sort(p+1,p+n+1,cmp);
for(int i=1,a,b,c;i<=m;i++){
cin>>a>>b>>c;
add(a,b,c); add(b,a,c);
}
int l=2,r=n-1;
while(l<=r){
int mid=(l+r)/2;
if(Dijkstra(p[mid].val)) r=mid-1;
else l=mid+1;
}
cout<<f[l];
return 0;
}
by Archy_ @ 2024-08-28 18:53:20
优先队列默认是把大的值放到顶,Dij需要把小的放上面,不知道是不是这个问题