【解题思路】
spfa+二分
二分的条件就是 以当前值为最大值 判断是否有一条路可以使得
每条边的收费都小于等于此值 并且 走到终点之后血量不会被扣光
【code】
1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 #include <algorithm> 5 #define inf 0x3f3f3f3f3f 6 using namespace std; 7 struct node{ 8 int s; 9 int nxt; 10 int endd; 11 }e[100005]; 12 int h[100005],t; 13 int n,m,b,ans; 14 int dis[100005]; 15 int x[100005],y[100005]; 16 int q[100005],tail,head; 17 bool inq[100005]; 18 void add(int u,int v,int x){ 19 t++; 20 e[t].nxt=h[u]; 21 h[u]=t; 22 e[t].endd=v; 23 e[t].s=x; 24 } 25 bool SPFA(int mid){ 26 memset(dis,inf,sizeof(dis)); 27 memset(inq,0,sizeof(inq)); 28 queue <int> q; 29 inq[1]=true; 30 dis[1]=0; 31 q.push(1); 32 while(!q.empty()){ 33 int top=q.front(); 34 q.pop(); 35 inq[top]=false; 36 for(int i=h[top];i!=0;i=e[i].nxt){ 37 int v=e[i].endd; 38 if(dis[v]>dis[top]+e[i].s&&x[v]<=mid){ 39 dis[v]=dis[top]+e[i].s; 40 if(!inq[v]){ 41 inq[v]=true; 42 q.push(v); 43 } 44 } 45 } 46 } 47 if(dis[n]<=b)return true; 48 else return false; 49 } 50 int main(){ 51 //freopen("1462.in","r",stdin); 52 //freopen("1462.out","w",stdout); 53 scanf("%d%d%d",&n,&m,&b); 54 for(register int i=1;i<=n;i++){ 55 scanf("%d",&x[i]); 56 y[i]=x[i]; 57 } 58 int cnt=0; 59 for(register int i=1;i<=m;i++){ 60 int u,v,s; 61 scanf("%d%d%d",&u,&v,&s); 62 add(u,v,s); 63 add(v,u,s); 64 } 65 sort(y+1,y+n+1); 66 if(SPFA(inf)==false){ 67 printf("AFK\n"); 68 return 0; 69 } 70 int l=1,r=n; 71 while(l<=r){ 72 int mid=l+r>>1; 73 if(SPFA(y[mid])){ 74 ans=y[mid]; 75 r=mid-1; 76 } 77 else l=mid+1; 78 } 79 printf("%d\n",ans); 80 return 0; 81 }
1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 #include <algorithm> 5 #define inf 0x3f3f3f3f3f 6 using namespace std; 7 struct node{ 8 int s; 9 int nxt; 10 int endd; 11 }e[100005]; 12 int h[100005],t; 13 int n,m,b,ans; 14 int dis[100005]; 15 int x[100005],y[100005]; 16 int q[100005],tail,head; 17 bool inq[100005]; 18 void add(int u,int v,int x){ 19 t++; 20 e[t].nxt=h[u]; 21 h[u]=t; 22 e[t].endd=v; 23 e[t].s=x; 24 } 25 bool SPFA(int mid){ 26 memset(dis,inf,sizeof(dis)); 27 memset(inq,0,sizeof(inq)); 28 queue <int> q; 29 inq[1]=true; 30 dis[1]=0; 31 q.push(1); 32 while(!q.empty()){ 33 int top=q.front(); 34 q.pop(); 35 inq[top]=false; 36 for(int i=h[top];i!=0;i=e[i].nxt){ 37 int v=e[i].endd; 38 if(dis[v]>dis[top]+e[i].s&&x[v]<=mid){ 39 dis[v]=dis[top]+e[i].s; 40 if(!inq[v]){ 41 inq[v]=true; 42 q.push(v); 43 } 44 } 45 } 46 } 47 if(dis[n]<=b)return true; 48 else return false; 49 } 50 int main(){ 51 //freopen("1462.in","r",stdin); 52 //freopen("1462.out","w",stdout); 53 scanf("%d%d%d",&n,&m,&b); 54 for(register int i=1;i<=n;i++){ 55 scanf("%d",&x[i]); 56 y[i]=x[i]; 57 } 58 int cnt=0; 59 for(register int i=1;i<=m;i++){ 60 int u,v,s; 61 scanf("%d%d%d",&u,&v,&s); 62 add(u,v,s); 63 add(v,u,s); 64 } 65 sort(y+1,y+n+1); 66 if(SPFA(inf)==false){ 67 printf("AFK\n"); 68 return 0; 69 } 70 int l=1,r=n; 71 while(l<=r){ 72 int mid=l+r>>1; 73 if(SPFA(y[mid])){ 74 ans=y[mid]; 75 r=mid-1; 76 } 77 else l=mid+1; 78 } 79 printf("%d\n",ans); 80 return 0; 81 }