真可以,我昨天写的全不对。今天写的一次ac
就是二分答案+spfa
#include#include #include #include using namespace std;int n,m;long long b;long long price[11000];struct node{ int point; int nxt; long long weight;};node line[101000];int head[10100],tail;bool inque[11000];queue q;long long dis[11000];bool check(long long val){ if(price[1]>val) return true; for(int i=1;i<=n;i++) dis[i]=1844674407370955161; dis[1]=0; q.push(1); inque[1]=true; int pass; while(!q.empty()) { pass=q.front(); q.pop(); inque[pass]=false; for(int i=head[pass];i;i=line[i].nxt) if(dis[line[i].point]>dis[pass]+line[i].weight&&price[line[i].point]<=val) { dis[line[i].point]=dis[pass]+line[i].weight; if(!inque[line[i].point]) { inque[line[i].point]=true; q.push(line[i].point); } } } if(dis[n]==1844674407370955161||dis[n]>b) return true; return false;}void add(int a,int b,long long c){ line[++tail].point=b; line[tail].weight=c; line[tail].nxt=head[a]; head[a]=tail; return ;}int main(){ scanf("%d%d%lld",&n,&m,&b); long long l=0,r=0; for(int i=1;i<=n;i++) { scanf("%lld",&price[i]); r=max(r,price[i]); } int a,d; long long c; for(int i=1;i<=m;i++) { //scanf("%d%d%lld",&a,&d,&c); cin>>a>>d>>c;//不知道为什么scanf不对 add(a,d,c); add(d,a,c); } if(check(r+1)) { printf("AFK"); return 0; } while(l >1; if(check(mid)) l=mid+1; else r=mid; } printf("%lld",l); return 0;}