我错的可能太睿智了:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int T = 2e6+10;
struct eee {
int to,nex,w;
}edge[T<<1];
int head[T],cnt = 0;
void add(int u,int v,int w) {
cnt++;
edge[cnt].to = v;
edge[cnt].w = w;
edge[cnt].nex = head[u];
head[u] = cnt;
}
int n,m,b;
int mon[T];
int d[T],vis[T];
void dij(int s,int xian) {
memset(d,63,sizeof(d));
memset(vis,0,sizeof(vis));
d[s] = 0;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int>> >q;
q.push(make_pair(0,s));
int last,lin,dd;
while(q.size()) {
last = q.top().second;
q.pop();
if(vis[last]) continue;
vis[last] = 1;
for(int i = head[last];i;i = edge[i].nex) {
if(mon[lin] > xian) continue;//33行
lin = edge[i].to,dd = edge[i].w;//34行
if(d[lin] > d[last]+dd) {
d[lin] = d[last]+dd;
q.push(make_pair(d[lin],lin));
}
}
}
}
int mmm[T];
signed main() {
scanf("%lld%lld%lld",&n,&m,&b);
for(int i = 1;i <= n;mmm[i] = mon[i],i++)
scanf("%lld",&mon[i]);
int u,v,w;
for(int i = 1;i <= m;i++) {
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
sort(mmm+1,mmm+n+1);
int ans = 0;
for(int i = (1 << 14);i;i >>= 1) {
if(ans+i <= n) {
if(mmm[ans+i] < mon[1] || mmm[ans+i] < mon[n]) {
ans += i;
continue;
}
dij(1,mmm[ans+i]);
if(d[n] > b)
ans += i;
}
}
ans++;
if(ans > n) printf("AFK");
else printf("%lld",mmm[ans]);
return 0;
}
第33行和第34行,应先赋值在判断
如果开 long long RE 0分,不开 AC + WA 30分,不知道是神马原因