【算法】通信线路(二分,堆优化版dijkstra)

news2024/10/7 16:15:15

题目

        在郊区有 N 座通信基站,P 条 双向 电缆,第 i 条电缆连接基站 Ai 和 Bi。

        特别地,1 号基站是通信公司的总站N 号基站位于一座农场中

        现在,农场主希望对通信线路进行升级,其中升级第 i 条电缆需要花费 Li。

        电话公司正在举行优惠活动。

        农产主可以指定一条从 1 号基站到 N 号基站的路径,并指定路径上不超过 K 条电缆,由电话公司免费提供升级服务。

        农场主只需要支付在该路径上剩余的电缆中,升级价格最贵的那条电缆的花费即可。

        求至少用多少钱可以完成升级。

输入格式

        第 1 行:三个整数 N,P,K。

        第 2..P+1 行:第 i+1 行包含三个整数 Ai,Bi,Li。

输出格式

        包含一个整数表示最少花费。

        若 1 号基站与 N 号基站之间不存在路径,则输出 −1。

数据范围

0 ≤ K < N ≤ 1000
1 ≤ P ≤ 10000
1 ≤ Li ≤ 1000000

思路

我们可以根据以下样例得到一张图

样例:
5 7 1
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6

 

暴力写法,我们可以从0遍历到1000001,找到一个值x:

        1、在选择 1 ~  n 的路线中,比这个值x大的边权为 k 个。

        2、在满足1条件的 x 集合中,选取最小的那个值。

在寻找最短路的时候,可以将大于 x 的边权当作 1 ,把小于等于 x 的边权当作 0 。

dist数组中储存到当前点经过的大于x的边的个数。

从0~1000001时间复杂度太大,可以使用二分进行优化。

 

代码 

#include<bits/stdc++.h>
using namespace std;

const int N = 1010,M = 20010;
typedef pair<int,int> PII;
int n,m,k;// n点数,m边数,k免费电缆数
int h[N],e[M],w[M],ne[M],idx;// 加权邻接表五件套
int dist[N];// 到达第i的点,最少经过多少个超过bound的电缆
bool st[N];// 第i个点的最小值是否已经被确定

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)// 堆优化版dijkstra算法
{
    memset(st,0,sizeof(st));// 初始状态,所有点都没有确定最小值
    memset(dist,0x3f,sizeof(dist));// 所有点的距离初始为无穷大
    dist[1] = 0;// 通信公司的总站为0
    priority_queue<PII,vector<PII>,greater<PII>> q;
    q.emplace(0,1);
    st[1] = true;
    while(!q.empty())
    {
        auto t = q.top();// 取出队头节点,此时该点已经确定为最小值
        q.pop();
        int x = t.second;
        st[x] = false;
        for(int i = h[x]; i != -1; i = ne[i])
        {
            int j = e[i],v = w[i] > bound;// 如果这条边的边权大于bound,则边权为1
            if(dist[j] > dist[x] + v)
            {
                dist[j] = dist[x] + v;
                if(!st[j])
                {
                    st[j] = true;
                    q.emplace(dist[j],j);
                }
            }
        }
    }
    return dist[n] <= k;
}


int main()
{
    cin >> n >> m >> k;// n点数,m边数,k免费电缆数

    memset(h,-1,sizeof(h));// 将表头初始化为-1
    while(m --)// 输入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) / 2;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    if(l == 1e6 + 1) l = -1;
    cout << l << endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1178198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tensor.scatter_add_函数解释:

Tensor.scatter_add_(dim, index, src) → Tensor out.scatter_add_(dim, index, src) 1.参数&#xff1a; dim (int) – 哪一dim进行操作 index (LongTensor) – 要在的out的哪一index进行操作 src (Tensor) – 待操作的源数字 2.官方的解释的操作如下&#xff1a; 3.例…

基于8086汽车智能小车控制系统

**单片机设计介绍&#xff0c;基于8086汽车智能小车控制系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于 8086 的汽车智能小车控制系统是一种将微处理器技术应用于汽车控制的系统。下面是其主要的设计介绍&#xff1a; 硬…

ubuntu22.04桌面版系统无法识别USB摄像头

虚拟机连接电脑摄像头连接失败&#xff08;驱动程序错误&#xff09; 本文为转载&#xff1a;版权归远作者所有&#xff0c;之所以转载是为了避免被原作者删除 巴黎铁塔下的女孩 你尽管努力&#xff0c;剩下的交给时间 虚拟机调用电脑的摄像头&#xff0c;正常情况下只需点击…

方案分享:F5机器人防御助企业应对复杂攻击

企业是Bot攻击者的目标&#xff0c;网络犯罪分子会不断调整他们的攻击&#xff0c;来攻破愈发成熟的Bot防护&#xff0c;这使企业安全团队时刻处于紧张状态。如果不能有效地管理Bot&#xff0c;应用性能、客户体验和业务都会被影响&#xff0c;但在尝试阻止这些攻击时&#xff…

技术分享 | web自动化测试-文件上传与弹框处理

实战演示 文件上传 input 标签使用自动化上传&#xff0c;先定位到上传按钮&#xff0c;然后 send_keys 把路径作为值给传进去. 如图所示&#xff0c;是企业微信文件上传的页面 定位到标签为 input&#xff0c;type 为 file 的元素信息&#xff0c;然后使用 send_keys 把文件…

Harbor企业级Registry基础镜像仓库的详细安装使用教程(保姆级)

Harbor Docker 官方提供的私有仓库 registry&#xff0c;用起来虽然简单 &#xff0c;但在管理的功能上存在不足。 Harbor是vmware一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。 ha…

原语:串并转换器

串并转换器OSERDESE2 可被Select IO IP核调用。 OSERDESE2允许DDR功能 参考&#xff1a; FPGA原语学习与整理第二弹&#xff0c;OSERDESE2串并转换器 - 知乎 (zhihu.com) 正点原子。 ISERDESE2原语和OSERDESE2原语是串并转换器&#xff0c;他的的功能都是实现串行数据和并行…

阿里云服务器怎么购买更省钱?优惠入口分享

阿里云服务器怎么购买更省钱&#xff1f;不要直接在云服务器页面购买&#xff0c;不划算&#xff0c;在阿里云特价活动上购买更优惠&#xff0c;阿腾云atengyun.com分享阿里云服务器省钱购买方法&#xff0c;节省90%&#xff0c;可以先在阿里云CLUB中心领券 aliyun.club 专用满…

JavaScript_Element对象_方法

1、Element.focus() Element.focus方法用于将当前页面的焦点&#xff0c;转移到指定元素上 2、Element.blur() Element.blur方法用于将焦点从当前元素移除 3、Element.remove() Element.remove方法用于将当前元素节点从它的父节点移除 4、Element.getBoundingClientRect() …

蓝桥杯练习

即约分数 题目 思路 遍历所有的x&#xff0c;y&#xff0c;判断x/y是不是即越约分数。 代码 #include <iostream> using namespace std; int gcd(int x,int y) {int r;while(y!0){rx%y;xy;yr;}return x; } int main() {// 请在此输入您的代码int sum4039;//1/y和x/1都…

C函数速查手册

链接下载&#xff1a;提取码:Tywdhttps://www.123pan.com/s/JRpSVv-PLnjv.html 双击打开即可

RxJava/RxAndroid的基本使用方法(一)

文章目录 一、什么是RxJava二、使用前的准备1、导入相关依赖2、字段含意3、Upstream/Downstream——上/下游4、BackPressure5、BackPressure策略6、“热” and “冷” Observables7、 基类8、事件调度器9、操作符是什么&#xff1f; 三、RxJava的简单用法1、Observable——Obse…

Docker安装教程

Docker安装教程 安装教程Centos7.6docker镜像源修改docker目录修改 Ubuntu20.04docker镜像源修改docker数据目录修改 安装教程 Centos7.6 &#x1f680;docker支持的Cetnos操作系统版本 CentOS 7 CentOS 8 (stream) CentOS 9 (stream) &#x1f680;支持的CPU ARM/X86_64 查看…

django+drf+vue 简单系统搭建 (1) - django创建项目

本系列文章为了记录自己第一个系统生成过程&#xff0c;主要使用django,drf,vue。本人非专业人士&#xff0c;此文只为记录学习&#xff0c;若有部分描述不够准确的地方&#xff0c;烦请指正。 建立这个系统的原因是因为&#xff0c;在生活中&#xff0c;很多觉得可以一两行代码…

分页存储管理、分段存储管理、段页式存储管理、两级页表

目录: 分页存储管理 基本地址存储机构 具有快表的地址存储机构 两级页表 分段存储管理 段页式管理方式 分页存储管理(重点) 首先回顾,逻辑地址和物理地址. 为什么要引入分页存储管理? 把物理地址下,离散的各个小片都利用起来,也就是在逻辑地址中看似是连续存储的,实际上对应…

ViT模型中的tokens和patches概念辨析

概念辨析 在ViT模型中&#xff0c;“tokens”&#xff08;令牌&#xff09;和"patches"&#xff08;图像块&#xff09;是两个相关但不同的概念。 令牌&#xff08;Tokens&#xff09;&#xff1a;在ViT中&#xff0c;令牌是指将输入图像分割成固定大小的图块&#…

java 之多态的实现之方法的重载和方法重写

文章目录 多态的主要概念和实现方式&#xff1a;重写重写方法的规则&#xff1a;示例&#xff1a;调用重写方法&#xff1a;注意事项&#xff1a; 重载方法重载的条件&#xff1a;方法重载的例子&#xff1a;重载方法的调用&#xff1a;注意事项&#xff1a; 在 Java 中&#x…

基于单片机GP2D12测距-proteus仿真-源程序

基于51单片机红外测距-proteus仿真-源程序 一、系统方案 本设计采用51单片机作为主控器&#xff0c;液晶1602显示&#xff0c;GP2D12采集距离值&#xff0c;按键设置报警阀值&#xff0c;测量值超过阀值&#xff0c;蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单…

文件重命名自动化:批量处理让生活更简单

在我们的日常生活和工作中&#xff0c;需要处理大量的文件&#xff0c;无论是文档、图片、音频还是视频。很多时候&#xff0c;为了更好地管理和查找&#xff0c;我们都需要对文件进行重命名。然而&#xff0c;一个一个地重命名文件既耗时又容易出错。幸运的是&#xff0c;随着…

婴儿车上架美国站亚马逊TEMU平台认证标准要求ASTMF833测试报告CPC认证

婴儿车上架跨境电商平台美国站或者出口美国需要提交CPC认证&#xff0c;ASTMF833测试标准检测合规报告&#xff0c;才能进入美国市场&#xff0c;由美国CPSC 认可的实验室出具的检测报告&#xff0c;确认每件商品均已通过检测&#xff0c;符合上述适用要求。 本政策适用的卧式…