WA on #6 #8
经测本地#6过了提交WA
以及为什么开O2全RE不开O2正常?
#include<bits/stdc++.h>
using namespace std;
#define MAXN 20005
#define INF 1e30
long long n,m,b,ans=INF;
long long f[MAXN],dis[MAXN];
int head[MAXN];
bool ok[MAXN];
int lu_n;
struct path{
int nxt,to;
long long dis;
}lu[10*MAXN];
void build(int u,int v,long long w)
{
lu[++lu_n].to=v;
lu[lu_n].dis=w;
lu[lu_n].nxt=head[u];
head[u]=lu_n;
}
struct node{
int which;
long long dis;
bool operator <(const node &x)const
{
return x.dis<dis;
}
};
priority_queue<node>q;
bool check(long long money)
{
for(int i=1;i<=n;i++) dis[i]=INF;
memset(ok,false,sizeof(ok));
dis[1]=0;
for(int i=1;i<=n;i++) if(f[i]>money)ok[i]=1;
q.push({1,0});
while(!q.empty())
{
node a=q.top();
q.pop();
int u=a.which;
if(ok[u])continue;
ok[u]=1;
for(int i=head[u];i;i=lu[i].nxt)
{
long long w=lu[i].dis;
int v=lu[i].to;
if(f[i]<=money&&dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
q.push({v,dis[v]});
}
}
}
if(dis[n]==INF||dis[n]>b)return false;
else return true;
}
int main()
{
cin>>n>>m>>b;
long long rt=INT_MIN,lt=INF;
for(int i=1;i<=n;i++)
{
cin>>f[i];
rt=max(rt,f[i]);
}
lt=f[n];
for(int i=1;i<=m;i++)
{
int u,v;long long w;
cin>>u>>v>>w;
build(u,v,w);
build(v,u,w);
}
while(lt<=rt)
{
long long mid=(lt+rt)>>1;
if(check(mid))
{
ans=min(ans,mid);
rt=mid-1;
}
else
{
lt=mid+1;
}
}
if(ans)cout<<ans;
else cout<<"AFK";
}