通信线路(二分+最短路)

该博客探讨了如何使用二分搜索策略解决一类特殊的最短路径问题。作者指出,当寻找第k+1条边的最大权重最小值时,可能的答案范围从0到无解的1e6+1。通过不断二分并利用最短路算法,在图中将大于当前二分值的边权重设为1,其余设为0,判断是否存在满足条件的路径。最终,使用双端队列BFS加速求解过程,找到最优解。

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

在这里插入图片描述

思路:从题意可以看出是求在一个从1——N的路径从第k+1条边的最大值最小,一看这最大值最小想到二分,我们发现答案可能是0(当1-n的路径经过的变数小于等于K时)也可能是没有解-1。所以我们二分时从0——1e6+1起,如果答案是1e6+1说明无解,然后我们不断二分出第K+1条边权x,然后在原图跑最短路,根据题意我们可以吧大于x的边权视为1,其他是0,这样我们就能知道当第k+1条边的权值为x时,有没有大于x的边数小于等于K,如果有说明我们的x还能往小继续二分。知道求出最优解,因为边权是01所以我们用双端队列BFS求最短路(可以快点)。

代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
 
using namespace std;
typedef long long ll;
#define SIS std::ios::sync_with_stdio(false)
#define space putchar(' ')
#define enter putchar('\n')
#define lson root<<1
#define rson root<<1|1
typedef pair<int,int> PII;
typedef pair<int,PII> PIII;
const int mod=1e9+7;
const int N=2e5+5;
const int inf=0x7f7f7f7f;

int gcd(int a,int b)
{
   
   
    return b==0?a:gcd(b,a%b);
}
 
ll lcm(ll a,ll b)
{
   
   
    return a*(b/gcd(a,b));
}
 
template <class T>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值