RT,数据在此,代码如下:
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
long long hp,money[10005];
long long l,r,v[10005];
bool f[10005];
struct node
{
long long first;
int second;
friend bool operator<(node x,node y){return x.first>y.first;}
};
priority_queue<node>q;
struct graph
{
int tot;
int hd[10005];
int nxt[50005],to[50005];
long long dt[50005];
void add(int u,int v,long long w)
{
tot++;
nxt[tot]=hd[u];
hd[u]=tot;
to[tot]=v;
dt[tot]=w;
return ;
}
}g;
bool check(long long x)
{
if(money[1]>x) return false;
memset(f,0,sizeof(f));
memset(v,0x3f,sizeof(v));
q.push((node){0,1});
v[1]=0;
while(!q.empty())
{
int xx=q.top().second;
q.pop();
if(!f[xx])
{
f[xx]=true;
for(int i=g.hd[xx];i;i=g.nxt[i])
if(money[g.to[i]]<=x&&v[g.to[i]]>v[xx]+g.dt[i])
{
v[g.to[i]]=v[xx]+g.dt[i];
q.push((node){v[g.to[i]],g.to[i]});
}
}
}
return v[n]<hp;
}
int main()
{
scanf("%d%d%lld",&n,&m,&hp);
for(int i=1;i<=n;i++)
{
scanf("%lld",&money[i]);
if(r<money[i]) r=money[i];
}
for(int i=1;i<=m;i++)
{
int u,v;
long long w;
scanf("%d%d%lld",&u,&v,&w);
g.add(u,v,w);
}
while(l<r)
{
long long mid=(l+r)/2;
printf("%lld %lld %lld\n",l,r,mid);
if(check(mid)) r=mid;
else l=mid+1;
}
if(check(r)) printf("%lld",r);
else printf("AFK\n");
return 0;
}
求大佬帮忙查错/kel,应该是dijkstra(check)挂了,但我照不出来/kk