铁锤 @ 2019-07-22 14:30:56
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
#define maxn 100005
#define pii pair<int ,int >
priority_queue<pii ,vector<pii> ,greater<pii> > q;
int u1[maxn],v1[maxn],u2[maxn],v2[maxn],head[10005],nxt[maxn],vis[maxn];
ll w1[maxn],w2[maxn],b[10005],c[10005];
ll dis[10005];
int n,m;
ll hp;
const ll inf=1000000005;
int check(int x) {
if(x<b[1]||x<b[n]) return 0;
for(int i=1;i<=n;i++) {
dis[i]=inf;
}
for(int i=1;i<=n;i++) {
if(x<=b[i])
vis[i]=1;
else
vis[i]=0;
}
dis[1]=0;q.push(make_pair(0,1));
while(!q.empty()) {
int u=q.top().second;q.pop();
if(vis[u])
continue;
vis[u]=1;
for(int i=head[u];i;i=nxt[i]) {
int v=v2[i];
if(dis[u]+w2[i]<dis[v]) {
dis[v]=dis[u]+w2[i];
q.push(make_pair(dis[v],v));
}
}
}
if(dis[n]<=hp) return 1;
return 0;
}
int main() {
scanf("%d%d%lld",&n,&m,&hp);
for(int i=1;i<=n;i++) {
scanf("%lld",&b[i]);
c[i]=b[i];
}
sort(c+1,c+n+1);
int cnt=0;
for(int i=1;i<=m;i++) {
scanf("%d%d%lld",&u1[i],&v1[i],&w1[i]);
cnt++;
nxt[cnt]=head[u1[i]];
head[u1[i]]=cnt;
v2[cnt]=v1[i],w2[cnt]=w1[i];
cnt++;
nxt[cnt]=head[v1[i]];
head[v1[i]]=cnt;
v2[cnt]=u1[i],w2[cnt]=w1[i];
}
if(!check(c[n])) {
printf("AFK\n");
return 0;
}
int l=1,r=n,mid;
while(l<=r) {
mid=(l+r)>>1;
if(check(c[mid])) {
ans=c[mid];
r=mid-1;
}
else l=mid+1;
}
printf("%lld",c[l]);
return 0;
}
by 潆汐 @ 2019-07-25 18:07:26
对于100%的数据,满足ci≤1000000000,fi≤1000000000,可能有两条边连接着相同的城市。 你加一个特判,if(u1[i]==v1[i])continue;应该就行了
by yu55555 @ 2019-08-24 15:27:46
我也72,5,8,11过不去