【起点到终点 走哪条路径使得(路径长度排序从大到小后) 第k+1条边最小】通信线路

news/2025/3/22 1:09:52

专注 效率 记忆
预习 笔记 复习 做题

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
 
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
 
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!

截取重要部分,看完全篇即懂
利用二分遍历最终答案
也就是遍历
第k+1条边的最小值
每次二分一个值
然后让图中所有大于该值的边为1
所有小于该值的边 为0
然后从起到走到终点
看最小距离(也就是大于该值的边数)
如果边数大于K了,那么以该值为最终答案,一定会使得最终答案变小,所以左区间右移(下次遍历更大的值)
如果边数等于K,那么该值为最终答案或许合适(右区间左移,下次遍历更小的值)
如果边数小于K,那么该值可能使得最终答案变大(也就是大于最终答案)那么也右区间左移动(下次遍历更小的值)

起点到终点 走哪条路径使得(路径长度排序后) 第k+1条边最小

    • 利用二分遍历最终答案
    • 补充问题:0 1边权,求最小距离

在这里插入图片描述

本题题意:
起点到终点 走哪条路径使得(路径长度排序后从大到小) 第k+1条边最小

一种想法就是
遍历所有
起点到终点的路径
求出第k+1边

这样时间复杂度太大

优化:
二分

利用二分遍历最终答案

也就是遍历
第k+1条边的最小值

每次二分一个值

然后让图中所有大于该值的边为1
所有小于该值的边 为0

然后从起到走到终点

看最小距离(也就是大于该值的边数)

如果边数大于K了,那么以该值为最终答案,一定会使得最终答案变小,所以左区间右移(下次遍历更大的值)

如果边数等于K,那么该值为最终答案或许合适(右区间左移,下次遍历更小的值)

如果边数小于K,那么该值可能使得最终答案变大(也就是大于最终答案)那么也右区间左移动(下次遍历更小的值)

补充问题:0 1边权,求最小距离

可以用双端队列
双端队列求最小距离

#include <cstring>
#include <iostream>
#include <algorithm>
#include <deque>using namespace std;const int N = 1010, M = 20010;int n, m, k;
int h[N], e[M], w[M], ne[M], idx;
int dist[N];
deque<int> q;
bool st[N];void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}bool check(int bound)
{memset(dist, 0x3f, sizeof dist);memset(st, 0, sizeof st);q.push_back(1);dist[1] = 0;while (q.size()){int t = q.front();q.pop_front();if (st[t]) continue;st[t] = true;for (int i = h[t]; ~i; i = ne[i]){int j = e[i], x = w[i] > bound;if (dist[j] > dist[t] + x){dist[j] = dist[t] + x;if (!x) q.push_front(j);else q.push_back(j);}}}return dist[n] <= k;
}int main()
{cin >> n >> m >> k;memset(h, -1, sizeof h);while (m -- ){int a, b, c;cin >> a >> b >> c;add(a, b, c), add(b, a, c);}int l = 0, r = 1e6 + 1;while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid;else l = mid + 1;}if (r == 1e6 + 1) cout << -1 << endl;else cout << r << endl;return 0;
}

https://dhexx.cn/news/show-4626924.html

相关文章

FreeRTOS任务切换

PendSV异常 SVC 用于产生系统函数的调用请求。例如&#xff0c;操作系统不让用户程序直接访问硬件&#xff0c;而是通过提供一些系统服务函数&#xff0c;用户程序使用 SVC 发出对系统服务函数的呼叫请求&#xff0c;以这种方法调用它们来间接访问硬件。因此&#xff0c;当用户…

操作系统复习4.2.0-磁盘组织和管理

磁盘的结构 磁盘、磁道、扇区 磁盘划分n圈磁道&#xff0c;每条磁道划分为多个扇区 磁盘读写 磁头移动到需要读写的扇区所在的磁道来完成读写 磁盘转起来让目标扇区在磁头下面划过 盘面和柱面 分类 按磁头分类&#xff1a;磁头可伸缩移动、不可伸缩移动(同一盘面上有多个…

详细解析MariaDB与MySQL两个数据库的区别

主要区别介绍 ● 发行版&#xff1a;MariaDB 是 MySQL 的一个分支&#xff0c;MySQL是 Oracle 公司的产品。 ● 开发公司&#xff1a;MariaDB 由 MariaDB 基金会和社区维护&#xff0c;MySQL 由 Oracle 公司维护。 ● 开发重点&#xff1a;MariaDB是功能改进和增强&#…

MoviePy介绍

MoivePy是一个用于视频编辑的Python库&#xff0c;可以&#xff1a;剪切、拼接、标题插入、视频合成、视频处理和创建自定义效果。它支持Windows、Linux、Mac&#xff0c;源码地址&#xff1a;https://github.com/Zulko/moviepy&#xff0c;最新发布版本v1.0.3&#xff0c;lice…

C++入门——关键字|命名空间|输入输出

前言&#xff1a; 今天我们又开启了一个崭新的大门——C面向对象编程语言&#xff0c;C是怎么来的呢&#xff1f;答案是&#xff1a;因为C语言的有很多不足&#xff0c;我们的祖师爷用着不爽&#xff0c;就不断更改&#xff0c;就改出来了一门新的语言&#xff0c;C。C语言兼容…

基于Springboot的社区论坛系统(源代码+数据库)055

部分代码地址 https://gitee.com/ynwynwyn/forum-public 基于Springboot的社区论坛系统(源代码数据库) 一、系统介绍 前台&#xff1a; 话题列表&#xff0c;搜索话题&#xff0c;发布话题通过标签筛选话题个人设置&#xff1a;修改个人信息&#xff0c;查看发布话题记录&a…

QT实现 WebsocketServer端与WebsocketClient 端通信

概 述 WebSockets 是一种通过单个 TCP 连接提供全双工通信信道的 web 技术。2011年&#xff0c;IETF 将 WebSocket 协议标准化为 RFC 6455 。Qt 提供的 QWebSocket 既可以用于客户端应用程序&#xff0c;也可以用于服务端应用程序&#xff0c;接口大部分和 QTcpSocket 一致。 …

《Apollo 智能驾驶进阶课程》

来自 &#xff1a; https://www.bilibili.com/video/BV1G341117NQ/ https://apollo.baidu.com/ 主要学习资源如下&#xff1a; Apollo社区公众号&#xff0c;直接有整个视频教程的微信推文教程&#xff1a;链接一个CSDN博主记录的笔记&#xff1a; https://blog.csdn.net/qq_45…

Python遍历网格中每个点

遍历网格中每个点 1. 问题描述2. Python实现2.1 网格参数初始化2.2 遍历赋值2.3 矩阵赋值1. 问题描述 最近需要实现一个对矩阵赋值并对矩阵表示的网格参数进行测试的任务,写了一段代码提供参考。 假设网格的长宽均为 2. Python实现 2.1 网格参数初始化 首先定义好需要划分…

【AI】Stable-Diffusion-WebUI使用指南

注&#xff1a;csdn对图片有审核&#xff0c;审核还很奇葩&#xff0c;线稿都能违规&#xff0c;为保证完整的阅读体验建议移步至个人博客阅读 最近AI绘画实现了真人照片级绘画水准&#xff0c;导致AI绘画大火&#xff0c;公司也让我研究研究&#xff0c;借此机会正好了解一下…