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

news/2024/10/18 8:22:25/

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

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

截取重要部分,看完全篇即懂
利用二分遍历最终答案
也就是遍历
第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;
}

http://www.ppmy.cn/news/193229.html

相关文章

第 3 章:使用 Vue 脚手架

目录 具体步骤 模板项目的结构&#xff08;脚手架文件结构&#xff09; Vue脚手架报错 修改方案&#xff1a; 关于不同版本的Vue vue.config.js配置文件 ref属性 props配置项 mixin(混入) 插件 小结&#xff1a; scoped样式 小结&#xff1a; Todo-list 案例 小结…

数据结构与算法11:堆

目录 【堆】 堆中插入和删除元素 堆排序 【堆的常见应用】 应用1&#xff1a;优先级队列 &#xff08;1&#xff09;合并有序小文件 &#xff08;2&#xff09;定时器功能 应用2&#xff1a;计算排行榜中前K个数据 应用3&#xff1a;求中位数 应用4&#xff1a;计算…

验证循环异或的可行性

验证循环异或的可行性 加密&#xff1a; 例如&#xff0c;&#xff08;p1、p2、p3、p4&#xff09; 每一个都是与前一个异或的结果异或&#xff1a; 新值 (0、p2⊕p1、p3⊕(p2⊕p1)、p4⊕(p3⊕(p2⊕p1)) 第一个值是p1与最后一个的值异或 (p4⊕p3⊕p2、p2⊕p1、p3⊕(p2⊕…

PHP程序员和java相比,容易找到心仪的工作吗?我来谈谈自己的看法

今天想和大家分享一个被讨论得比较多的话题&#xff0c;就是科班出身的人到底好不好找PHP程序员的工作。 因为我发现有很多老哥&#xff0c;之前可能并不是从事 IT 行业的&#xff0c;然后想学编程转行来做这一行&#xff0c;或者是有些大四即将面临毕业的老哥&#xff0c;可能…

数据结构---双链表

之前我们已经了解并实现了单链表&#xff0c;我们发现单链表实现头插头删还行&#xff0c;但是尾插尾删什么的需要遍历链表&#xff0c;使得时间复杂度增加&#xff0c;效率不是那么好&#xff0c;那么有没有改进的办法呢&#xff1f; 今天&#xff0c;我们就来了解并实现一下…

Docker 安装 Redis 容器 (完整详细版)

Docker 安装 (完整详细版) Docker 日常命令大全(完整详细版) 1、获取Redis镜像 Docker如果想安装软件 , 必须先到 Docker 镜像仓库下载镜像。 Docker 镜像仓库 ​ 2、下载Redis镜像 命令描述docker pull redis下载最新版Redis镜像 (其实此命令就等同于 : docker pull redis…

【数据结构】希尔排序

常见的排序算法有以上八种&#xff0c;所以预估会分成几期来讲&#xff0c;感兴趣的朋友们不妨点个收藏专栏。 ღ( &#xff65;ᴗ&#xff65; )比心 OJ链接 希尔排序 在 插入排序 已经提到当数组接近有序的时候&#xff0c;时间复杂度趋于O(N)。 所以希尔排序是基于直接插…

外包干了5年,女朋友嫌弃我,跑了。。。

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近5年的测试&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了5年&#xff0c;…