【复赛模拟试题】收费站(二分答案+Dijkstra)

2023-11-04

【问题描述】

  在某个遥远的国家里,有n个城市。编号为1 ,2,3,…,n。

  这个国家的政府修建了m条双向的公路。每条公路连接着两个城市。沿着某条公路,开车从一个城市到另一个城市,需要花费一定的汽油。

  开车每经过一个城市,都会被收取一定的费用(包括起点和终点城市)。所有的收费站都在城市中,在城市间的公路上没有任何的收费站。

  小红现在要开车从城市u到城市v(1<=u,v<=n)。她的车最多可以装下s升的汽油。在出发的时候,车的油箱是满的,并且她在路上不想加油。

  在路上,每经过一个城市,她要交一定的费用。如果她某次交的费用比较多,她的心情就会变得很糟。所以她想知道,在她能到达目的地的前提下,她交的费用中最多的一次最少是多少。这个问题对于她来说太难了,于是她找到了聪明的你,你能帮帮她吗?

【输入格式】

  第一行5个正整数,n,m,u,v,s。分别表示有n个城市,m条公路,从城市u到城市v,车的油箱的容量为s升。
  接下来有n行,每行1个正整数,fi。表示经过城市i,需要交费fi元。 
  再接下来有m行,每行3个正整数,ai,bi,ci(1<=ai,bi<=n)。表示城市ai和城市bi之间有一条公路,如果从城市ai到城市bi,或者从城市bi到城市ai,需要用ci升汽油。

【输出格式】

  仅一个整数,表示小红交费最多的一次的最小值,如果她无法到达城市v,输出-1。

【输入样例】

【样例1】
4 4 2 3 8
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3

【样例2】
4 4 2 3 3
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3

【输出样例】

【样例1】
8

【样例2】
-1

【数据范围】

对于60%的数据,满足n<=200,m<=10000,s<=200
对于100%的数据,满足n<=10000,m<=50000,s<=1000000000
对于100%的数据,满足ci<=1000000000,fi<=1000000000,可能有两条边连接着相同的城市。

先二分答案猜出需要交费的最大值,再带入图用Dijkstra算法求最优路径检验答案是否可行。SPFA因为题目给的边数比较多,会超时,所以在无负权值边的情况下一般用Dijkstra比较稳妥。

#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=10002,inf=1000000002;
int n,m,u,v,s,p[maxn],vis[maxn],d[maxn];
vector<int>g[maxn],w[maxn];

struct data
{
    int d,id;
    bool friend operator <(data a,data b)
    {
        return a.d>b.d;
    }
};

bool check(int mid)
{
    priority_queue<data>q;
    for(int i=1;i<=n;i++) d[i]=inf;
    d[u]=0;
    q.push((data){0,u});

    while(!q.empty())
    {
        data t=q.top(); q.pop();
        int i=t.id;
        if(p[i]>mid) continue; //掐掉交费大于mid的点
        if(d[i]<t.d) continue;
        d[i]=t.d;
        for(int k=0;k<g[i].size();k++)
        {
            int j=g[i][k],c=w[i][k];
            if(d[j]>d[i]+c)
            {
                d[j]=d[i]+c;
                q.push((data){d[j],j});
            }
        }
    }
    if(d[v]<=s) return 1;
    return 0; 
}

int main()
{
    //freopen("1.txt","r",stdin);
    //freopen("toll.out","w",stdout);
    scanf("%d %d %d %d %d",&n,&m,&u,&v,&s);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&p[i]);
    }

    int x,y,z;
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&x,&y,&z);
        g[x].push_back(y);
        g[y].push_back(x);
        w[x].push_back(z);
        w[y].push_back(z);
    }

    int a=0,b=inf,ans=inf;
    while(a<=b)
    {
        int mid=(a+b)>>1;
        if(check(mid))
        {
            b=mid-1;
            ans=mid;
        }
        else a=mid+1;
    }
    if(ans<inf) printf("%d\n",ans);
    else printf("-1\n");
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【复赛模拟试题】收费站(二分答案+Dijkstra) 的相关文章

  • 机器人路径规划之Dijkstra算法

    在机器人路径规划之动态窗口法文中 xff0c 介绍了一种局部路径规划方法 动态窗口法 xff0c 本文将介绍一种全局路径规划方法 Dijkstra算法 狄克斯特拉算法 Dijkstra算法是从一个顶点到其余各顶点的最短路径算法 xff0c
  • 最短路径算法——Dijkstra介绍

    个人心得体会 xff1a 理解这种或这类算法 xff0c 可以先从小规模的问题入手 xff0c 并逐渐推广到问题变复杂的情况 xff0c 这样理解起来也可以更方便和透彻 和数学归纳法很相似 图简介 以使用地图APP为例 xff0c 假设你想
  • Dijkstra算法-(迪杰斯特拉)算法的迭代实现与优先队列实现 图解算法过程

    Dijkstra算法 迪杰斯特拉 算法之迭代实现 Dijkstra算法 迪杰斯特拉 算法之优先队列实现 该算法的核心原理 很简单 如下图所示 先说说Dijkstra算法 迪杰斯特拉 算法之迭代实现 如下图为详细步骤 代码如下 两种实现方法都
  • 图论之dijkstra

    di jkstra是由迪杰斯特拉提出的一种图论算法 用于求一个点到其他所有点的最短距离 dijkstra的核心思想就是将所有的点分成两个集合A B 从B集合中找到一个离A集合内的点最近的点 把他加入A集合 然后再用这个点去迭代其他所有点 注
  • 迪杰斯特拉(Dijkstra)算法解决最短路径问题

    Dijkstra 算法介绍 迪杰斯特拉算法 Dijkstra 是由荷兰计算机科学家狄克斯特拉于1959年提出的 因此又叫狄克斯特拉算法 迪杰斯特拉 Dijkstra 算法是最经典的最短路径算法之一 用于计算一个结点到其他结点的最短路径 它的
  • 最短路径之迪克斯特拉(Dijkstra)算法

    何谓最短路径 顾名思义就是在一个图中 一个顶点到另外一个顶点的最短距离拉 那么这里有一点要注意 就是在网图中 边的权值各不相同 最短路径指的是俩点之间的连线权值最小 在非网图 边的权值都默认为1 中最短路径指的是边数最少的 从一个顶点到其余
  • Business Cycle 【UVALive - 7501】【二分答案+思维处理】

    题目链接 14年的EC 银牌题 但是现在的大牛们进步神速 估计如今已经是道铜牌题了 具体我们先讲一下题意 一个长度为N的自环圈 每个点 1 N 上有自己对应的权值 可能为负数 我们用一个初始值进入这个环 每次走到一个节点的时候会加上这个节点
  • 动物森友会【科大讯飞杯L题】【二分答案+最大流】

    题目链接 有N个物品 一周有7天 然后呢 要对应的每个物品都要达到各自的需求数量 于是问 最少需要几天才可以达到要求 很明显的 这是线性关系的 我们可以用二分答案来解决这个问题 然后呢怎么知道是否满足条件也就是来确定的 要满足每个物品都要拿
  • 【路径规划】(1) Dijkstra 算法求解最短路,附python完整代码

    好久不见 我又回来了 这段时间把路径规划的一系列算法整理一下 感兴趣的点个关注 今天介绍一下机器人路径规划算法中最基础的 Dijkstra 算法 文末有 python 完整代码 那我们开始吧 1 算法介绍 1959 年 荷兰计算机科学家 E
  • 最短路径——Dijkstra算法(C语言实现)

    最短路径 Dijkstra算法 基本概念 1 最短路径 非带权图 边数最少的路径 带权图 边上的权值之和最少的路径 基本思想 1 v 源点 S 已经生成最短路径的终点 w
  • 天梯题集——紧急救援(Dijkstra+倒序打印分析)

    Dijkstra算法 用于求单源到其他点的最短路径 紧急救援 该题与 Dijkstra模板题 的不同之处在于该题需要记录更多信息 主要思路从局部最优到整体最优 类似dp的思想 include
  • 使用 Dijkstra 算法寻找最短路径

    我需要找到图的两个顶点之间的最短路线 我有一个矩阵 其中包含所有权重 我该怎么做 目前 我有以下代码 private int Dijkstra int start int end bool done new bool 8 int paren
  • 如何从多路径 Dijkstra 重建路径?

    我目前正在编写一个用于图形的 PHP 库 我已经成功实现了单路径 Dijkstra 算法 但现在在路径重建阶段很难实现多路径版本 取下图 为了简单起见 该图只有从顶点 A 到 J 的路径 经过多个其他顶点 这些顶点的成本都是相等的 即每条路
  • 图 - 具有顶点权重的最短路径

    这是一个消费税 在某些图问题中 顶点可以有权重而不是 或者除了边的权重之外 设 Cv 为顶点的成本 v 和 C x y 边 x y 的成本 这个问题大家关心 寻找图 G 中顶点 a 和 b 之间最便宜的路径 路径的成本是边和顶点的成本之和
  • 如何在 QuickGraph Dijkstra 或 A* 中设置目标顶点

    我使用的是 QuickGraph 3 6 版 我找到了函数 SetRootVertex 但没有 SetTagretVertex 我需要这个 因为我正在巨大的图中搜索短路径 这会大大加快程序速度 有问题的类是 DijkstraShortest
  • 原始地理坐标和图形节点之间的最短路径

    我已经实现了一个简单的 Dijkstra 算法 用于使用 Java 查找 osm 地图上的最短路径 从 osm 文件创建的图形中的寻路效果非常好 但是 如果用户的当前位置和 或目的地不是该图的节点 只是原始坐标 我们如何将这些坐标 链接 到
  • 数组中超过 640 000 个元素 - 内存问题 [Dijkstra]

    我有一个脚本将 803 803 644809 每个图表内有 1 000 000 个值 使用 500 500 一切正常 但现在它崩溃了 它尝试分配超过 64MB 的内存 我没有 解决办法是什么 以某种方式 分裂 它还是 result mysq
  • 为什么使用 Dijkstra 算法而不是最佳(最便宜)优先搜索?

    从我到目前为止所读到的来看 这最佳优先搜索 https en wikipedia org wiki Best first search在找到到达目标的最短路径方面似乎更快 因为 Dijkstra 算法在遍历图时必须放松所有节点 是什么让 D
  • 使用斐波那契堆时 Dijkstra 是否更快?

    使用斐波那契堆时 Dijkstra 是否比使用二进制堆更快 我自己做了一些实现斐波那契堆的实验 并在 Dijkstra 中使用它 我还检查了 fibheap 库中现成的斐波那契堆 但没有一个实现能够更快地找到使用以下命令的最短路径 二进制堆
  • 如何在 dijkstra 算法中以 O(log n ) 时间更新优先级队列中的键?

    过去一周我一直在研究 dijkstra 算法 我在 java 中有正确的运行代码 它使用数组来计算标准 findMin 函数 该函数为您提供距离最小的顶点 显然它是 O n 现在我希望使用优先级队列 最小堆 来实现它 我的思考过程是 whi

随机推荐

  • ubuntu中pip3升级出现Traceback (most recent call last): File “/usr/bin/pip3”, line 9, in from pip import

    ubuntu18 04中pip3升级之后遇到这样的问题 Traceback most recent call last File usr bin pip3 line 9 in from pip import main ImportError
  • 超出表空间"users"的空间限额

    这是因为用户被数据库限制了在建表的表空间 执行一下下面的语句后 再执行建表语句 alter user 用户名 quota unlimited on 表空间名字
  • QLabel设置背景图片

    您可以使用Qt的QPalette类来设置QLabel的背景图片 以下是一个简单的示例 include
  • 2021爱分析·房企数字化厂商全景报告

    目录 1 研究范围定义 2 市场全景地图 3 市场定义与厂商评估 4 入选厂商列表 关于爱分析 研究与咨询服务 法律声明 1 研究范围定义 研究范围 本报告研究对象为房企 主要包括从事房地产开发 商写资产运营 物业服务等业务的综合性房地产企
  • [QT编程系列-20]:基本框架 - QT的测试框架QTest

    目录 第1章 QT测试框架与搭建步骤 第2章 Qt Test概述 2 1 概述 2 2 测试代码和项目代码共存 2 3 如何运行测试代码 2 4 ctest命令 第3章 单元测试代码示例 3 1 代码目录结构 3 2 代码示例 第4章 QT
  • Java写Mybatis的配置文件的注意事项

    先来聊聊properties配置文件的一些坑 1 注意自己当前使用的mysql的版本 版本低的 driver配置是 具体的版本是多少忘了 com mysql jdbc Driver 版本高的用 com mysql cj jdbc Drive
  • STM32中断与事件的区别

    STM32中断与事件的区别 在我们配置中断时 时常会困惑于什么是事件模式 EXTI InitStruct EXTI Mode 怎样选择 是选择中断模式还是事件模式 EXTI InitStruct EXTI Line EXTI Line0 E
  • IDEA 控制台输出中文乱码的简单解决方案

    目录 引言 解决方案 第一步 第二步 下载JDK 选择现有的JDK 完成 引言 很多人 包括我 在编程的时候可能会发现 在IDEA的控制台输出中文字符的时候 会出现乱码 如下图 于是就在网上搜了很多教程 结果弄完了却还是不行 下面是我的解决
  • 编译原理(第3版)第二章部分习题答案

    1 文法G A B C a b c P S 其中P为 S gt Ac aB A gt ab B bc 写出L G S 的全部元素 解 L G S 的全部元素为 a b c 2 文法G N 为 N gt D ND D gt 0 1 2 3 4
  • 修改intelliJ IDEA默认Mvnen插件镜像地址 ,加速依赖安装

    前言 1 3叙述的是如何找到idea的mvnen 如果是手动安装的Mvnen 直接跳到4 本文基于Linux平台 mac windows可作参考 如果是ToolBox安装的IDEA 那么桌面启动程序文件一般在 home USER local
  • 华为OD机试 Python 【五子棋迷】

    题目 张兵和王武喜欢玩五子棋 现在轮到张兵了 他面前的棋盘上有一排棋子 棋子规则 1 表示白子 0 表示没子 是个空位 1 表示黑子 一排棋子中 棋子数量L要满足 1 lt L lt 40 并且L是奇数 你要写个程序帮张兵找到最佳的落子位置
  • 【Apache Spark 】第 3 章Apache Spark 的结构化 API

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Tomcat提高并发量,性能优化

    系统采用的常用框架 Mysql SSM Tomcat结构 测试工具使用的是Jmeter 刚开始测试 并发量为200 s 居然错误率达到了15 让我很郁闷 按Tomcat的性能200的并发量应该完全没问题 于是我搜了一下提高Tomcat并发量
  • 区块链入门系列之P2P

    区块链入门系列文章 区块链基本概念和名词解释 P2P 共识算法 梅克尔 帕特里夏树 从零开始搭建区块链 这里写自定义目录标题 区块链入门系列文章 前言 中心化架构 去中心化架构 NAT 锥型NAT 完全锥型NAT 非完全锥型NAT IP受限
  • Devops 基础介绍

    文章目录 前言 一 软件开发概述 1 软件开发生命周期 2 软件开发瀑布模型 3 软件的敏捷开发 3 1 迭代开发 3 2 增量开发 3 3 敏捷开发如何迭代 3 4 敏捷开发的好处 二 持续集成概述 1 什么是持续集成 2 持续集成的流程
  • 嵌入式C中__attribute__编译属性说明

    锲而不舍 金石可镂 文章目录 前言 参数介绍 1 aligned 2 packed 3 at 4 section 总结 前言 attribute 是GNU C扩展下一大特性机制 用于设置函数属性 Function Attribute 变量属
  • http及https的 抓包分析

    HTTP及HTTPS实验 1 访问http wwww qq com和https www sangfor com cn并抓包 分析从PC访问到结束访问网站的全数据流过程 2 分析DNS解析过程及请求回应报文结构 掌握DNS报文结构特征和DNS
  • 编译执行和解释执行有什么区别

    什么是脚本 脚本是嵌入式代码 无需编译器就可以在环境中运行 起到解释作用 动态程序一般有两种方式 1 二进制方式是将我们编写的程序进行编译 编程机器可以识别的指令代码 然后再执行 这种已编译好的程序让我们只能执行 使用 却看不他的程序内容
  • vue的常用的属性有哪些?

    new vue el data template methods computed render watch vue总共有7个常用的属性 如上 el 表示一个vue对象需要挂载到哪一个html对象上面 值为那个html对象的id data
  • 【复赛模拟试题】收费站(二分答案+Dijkstra)

    问题描述 在某个遥远的国家里 有n个城市 编号为1 2 3 n 这个国家的政府修建了m条双向的公路 每条公路连接着两个城市 沿着某条公路 开车从一个城市到另一个城市 需要花费一定的汽油 开车每经过一个城市 都会被收取一定的费用 包括起点和终