luogu-P1462 通往奥格瑞玛的道路 && ybt-修建道路【最短路+二分】

博客探讨了如何使用二分法解决图论中的最短路问题,通过分析luogu P1462和ybt F.2两道题目,阐述了在寻找最大值中的最小值时二分法的优势。文章指出,当答案具有单调性时,二分法是有效的策略。在处理涉及血量和费用的最短路问题时,将损失血量视为边的长度,并应用单源最短路算法。另一题同样利用二分法,通过设置最大代价来确定需要政府修建的最小道路数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P1462 通往奥格瑞玛的道路 link

思路:
首先,看见这个问题,就应该想到二分。

所有类似于“求解所有的最大值中的最小值”的问题,都应该先想一想用二分答案的方法来写。

为什么呢?因为二分答案就是用来求解这种问题的,它通过猜测目前的答案+验证目前答案是否成立来求解,这种“假设已经知道答案”的方法比用题目信息求解答案的方法要优秀很多,而且复杂度也仅仅是加了一个log。

但是还要注意一点,除了这种经典问法以外,还要通过答案是否具有单调性来判断是否可以使用二分答案的方法

不具有单调性的问题是不可以使用这种方法的!
回到本题,我们猜测可以使用二分答案后,再验证:由于 “我们假设需要的钱”越多,能走的点也就越多,可以走到终点的可能性也就越大,所以,这题是完全可以通过二分答案来写的。

然后,我们发现这里有两个变量:血量和费用。至于费用,我们已经用二分答案解决了,现在只需要解决血量的问题。 我们在上面分析了,损失血量是和边绑定在一起的,所有可以把损失血量看做每条边的长度,进而就到了这题的中心——单源最短路。

#include<bits/stdc++.h>
using namespace std;
#define ong long long
const int N=10010;
const int M=100010;
const ong inf=LLONG_MAX/3;  //小心爆long long
int n,m,b,u,v;
int l,r,mid;
ong wi;  //爆int了
struct node{
   
	int a;
	ong dis;
};
bool operator < (node x,node y){
   
	return x.dis>y.dis; 
} priority_queue<node> q;
int top,g[N],f[N];
ong dis[N];
bool vis[N];
struct edge{
   
	int adj,nex;
	ong w;
}e[M];
void add(int x,int y,ong wor){
   
	e[++top]=(edge){
   y,g[x],wor}; 
	g[x]=top;
} void Dijkstra(int maxn){
   
	for(int i=1;i<=n;i++){
   
		dis
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值