随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

城市之间有 mm 条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量。

每次经过一个城市,都会被收取一定的过路费(包括起点和终点)。路上并没有收费站。

假设 1 为暴风城,n为奥格瑞玛,而他的血量最多为 b,出发时他的血量是满的。如果他的血量降低至负数,则他就无法到达奥格瑞玛。

不希望花很多钱,他想知道,在可以到达奥格瑞玛的情况下,他所经过的所有城市中最多的一次收取的费用的最小值是多少。

 

二分这个最多的费用 mid,检验时跑最短路,看能否不死( 路径上的最大值为mid)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <bits/stdc++.h>
using namespace std ;
 const int N=1e4+3,M=2e5;
  
 int n,m,dis[N],vis[N];
 int K,val[N],w[M],nxt[M],go[M],hd[N],all;
  
 void add(int x,int y,int z){
     go[++all]=y; w[all]=z,nxt[all]=hd[x],hd[x]=all;
 }
  
 int chk(int md){
    int i,x,y,z;
  
    queue<int> q;
    for(i=1;i<=n;i++) dis[i]=1e9;
    memset(vis,0,sizeof(vis));
    dis[1]=0;
    q.push(1);
     
    while(q.empty()==0){
        x=q.front(),q.pop(); vis[x]=0;
         
        for(i=hd[x];i;i=nxt[i]){
            y=go[i],z=w[i];
            if(dis[y]>dis[x]+z&&md>=val[y]){
                dis[y]=dis[x]+z;
                if(vis[y]==0) q.push(y),vis[y]=1;
            }
        }
    }
    return dis[n]<K;
 }
 signed main(){
    int i,x,y,z,md,t,l=0,r=0;
     cin>>n>>m>>K;
    for(i=1;i<=n;i++) cin>>val[i],r=max(r,val[i]);
    l=max(val[1],val[n]);
      
    for(i=1;i<=m;i++) cin>>x>>y>>z,add(x,y,z),add(y,x,z);
     
     if (!chk(1e9)){ cout<<"AFK" ; return 0;}
        
    while(l<=r){
       md=(l+r)/2;
       if(chk(md)) r=md-1; else l=md+1;
    }
    cout<<l;
 }

 

posted on   towboat  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示