城市之间有 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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!