AtCoder Beginner Contest 143 E.Travel by Car(最短路)

2023-05-16

题目链接

大意:给你一个无向带权图,给你一些询问点, s , t s,t s,t,你从s出发有 l l l升的油,走 x x x距离耗费 x x x油,你可以在点上加油,不能在路径上加油,问你到 t t t最少加几次油。

显然的最短路问题,预处理出所有起点到其他地方的最少加油次数即可。
注意优化复杂度。。。。。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=3e2+10;
#define fi first
#define se second
#define pb push_back
LL dis[N][N];
int n,m,l,vis[N];
struct uzi{
    int a;
    LL b;
    LL c;
    bool operator <(const uzi & t)const{
        if(c==t.c)return b<t.b;
        return c>t.c;
    }
};
vector<pair<int,int> >v[N];

LL tmp[N][N];
int main() {
    ios::sync_with_stdio(false);
    cin>>n>>m>>l;
    for(int i=1;i<=m;i++){
        int s,t,w;
        cin>>s>>t>>w;
        v[s].pb({t,w});
        v[t].pb({s,w});
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i!=j)dis[i][j]=LLONG_MAX,tmp[i][j]=0;
            else dis[i][j]=0;
        }
    }
    for(int i=1;i<=n;i++){
        priority_queue<uzi>q;
        memset(vis,0,sizeof vis);
        q.push({i,l,0});
        tmp[i][i]=l;
        while(!q.empty()){
            auto now=q.top();
            q.pop();
            vis[now.a]=0;
            for(auto k:v[now.a]){
                int cost=k.se;
                int tmpa=tmp[i][now.a];
                if(tmpa>=cost){
                    if(dis[i][k.fi]<dis[i][now.a])continue;
                    if(dis[i][k.fi]==dis[i][now.a]){
                        if(tmp[i][k.fi]>=tmpa-cost)continue;
                    }
                    dis[i][k.fi]=dis[i][now.a];
                    tmp[i][k.fi]=tmpa-cost;
                    if(!vis[k.fi])q.push({k.fi,tmpa-cost,dis[i][now.a]}),vis[k.fi]=1;
                }else if(l>=cost){
                    int need=1;
                    cost=need*l-cost;
                    if(dis[i][k.fi]<dis[i][now.a]+need)continue;
                    if(dis[i][k.fi]==dis[i][now.a]+need){
                        if(tmp[i][k.fi]>=cost)continue;
                    }
                    tmp[i][k.fi]=cost;
                    dis[i][k.fi]=dis[i][now.a]+need;
                    if(!vis[k.fi])q.push({k.fi,cost,need+dis[i][now.a] }),vis[k.fi]=1;
                }else {
                    continue;
                }
            }
        }
    }
    int q;
    cin>>q;
    for(int i=1;i<=q;i++){
        int s,t;
        cin>>s>>t;
        if(dis[s][t]==LLONG_MAX)cout<<-1<<endl;
        else cout<<dis[s][t]<<endl;
    }
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AtCoder Beginner Contest 143 E.Travel by Car(最短路) 的相关文章

随机推荐

  • 电子书下载网站汇总

    网站名称地址简介语言推荐指数备注Book4Uhttp www book4you sk 外文下载网站斯洛伐克语 BookYardshttps www bookyards com en welcome主要面向教师的门户网站 xff0c 其中的书
  • Docker版 E5续订的E5调用API续订服务:Microsoft 365 E5 Renew X

    本文是基于作者SundayRX提出的E5 调用API续订服务 xff1a Microsoft 365 E5 Renew X的基础上提出的Docker版本的E5调用API续订服务 基础的账号注册等过程见SundayRX的博客 xff1a 账号
  • Docker版 Linux百度网盘备份工具

    一些必须要知道的事 xff1a 这个镜像的主要目的是为了将服务器或者群晖等linux场景中的资料备份到百度网盘中容器的基础镜像为ubuntu镜像 容器的备份周期为每天的凌晨两点 具体步骤如下 xff1a 下载镜像 docker pull h
  • 操作系统(五)中断和异常

    1 5 中断和异常 在上节内核态与用户态的转换过程中曾经提到过 xff0c 操作系统会响应中断信号强制夺回CPU使用权 xff0c 使用户态转换为内核态 中断 是操作系统夺回CPU使用权的唯一方式 xff0c 如果没有 中断 机制 xff0
  • Mediacodec 如何硬件解码到纹理的

    Mediacodec 如何硬件解码到纹理的 背景 xff1a 网上很多关于mediacodec xff0c surface xff0c surfacetexture的源码分析 xff0c 以及内部原理 xff0c 但是都局限于各自的内容 x
  • pyinstaller 递归深度设置(A RecursionError occurred)

    简介 xff1a pyinstaller常用于打包python文件 xff0c 当导入的包过多时常会出现一个递归深度超过限制的错误 这个可以通过设置最大递归深度来解决 1 pyinstaller报错信息 61 61 61 61 61 61
  • labelme标注格式转coco格式

    摘要 xff1a labelme是广泛使用的深度学习标注工具 xff0c 支持目标检测和实例分割等任务的标注 xff0c 但是一些框架如detectron2 xff0c solo等需要的是coco格式的 xff0c 这里提供一个示例把lab
  • opencv C++ 旋转任意角度图片

    摘要 xff1a opencv里面似乎没有直接的旋转图片的接口 xff0c 这里实现一个旋转任意角度的方法 xff0c 在旋转的时候调用opencv里面的仿射变换函数实现 有两种旋转模式 xff1a 一种按图片中心旋转 xff0c 尺寸与原
  • C++ opencv曲线拟合

    简介 xff1a 此问题是在做旋转模板匹配的时候 xff0c 选择最好的匹配结果时产生的 查找资料发现多项式拟合问题可以变成一个超定方程的求解问题 xff0c 而opencv中本身有一个cv solve 函数可以求解线性方程组 xff0c
  • C# 中的Bitmap 和(c++)opencv之间的传递

    C 中的Bitmap 和 xff08 c 43 43 xff09 opencv之间的传递 文章目录 C 中的Bitmap 和 xff08 c 43 43 xff09 opencv之间的传递1 C 传递bitmap给C 43 43 2 Pix
  • opencv kmeans (C++)

    kmeans 函数原型 span class token keyword double span cv span class token operator span span class token function kmeans span
  • C++ explict

    文章目录 C 43 43 中的explicit是一个关键字 xff0c 用于修饰构造函数 xff0c 它可以防止编译器进行隐式类型转换 xff0c 只允许显式地调用构造函数 它不能用于隐式转换和复制初始化 例如 xff0c 在下面的代码中
  • C++ friend

    在C 43 43 中 xff0c friend是一个关键字 xff0c 用于声明一个非成员函数或类可以访问另一个类的私有成员 例如 xff0c 我们有一个名为ClassA的类 xff1a span class token keyword c
  • C++ enum 和enum class

    文章目录 C 43 43 enum 和 enum class共同点区别 C 43 43 enum 和 enum class 在C 43 43 中 xff0c enum 是一种定义枚举类型的方法 一个枚举是一个整数值的命名集合 可以通过以下方
  • VS2019设置cl.exe环境变量

    版本 xff1a VS2019 设置 cl 环境变量 xff08 加入系统环境变量 xff08 PATH xff09 xff09 步骤 xff1a 1 找到cl exe的所在路径 xff0c 一般都在 xff1a C Program Fil
  • 从汇编角度看c++20 协程

    从汇编角度看c 43 43 20 协程 背景 xff1a 在学习c 43 43 20 协程的时候 xff0c 总对协程里边的局部成员存储 xff0c 以及协程栈恢复有很多疑问 xff0c 本次从过年arm64角度来分析下 xff0c 具体情
  • Win10 使用 Xrdp 远程控制 ubuntu16 闪退

    问题描述 win10使用 Xrdp 远程控制 ubuntu16 4 出现闪退 都能到这一步 xff0c 但是刚登上Xrdp4桌面就闪退 xff0c 回到下图 xfce4桌面xubuntu desktop xff0c 重新建立桌面会话 spa
  • 【华为OD机试真题 Java】字符串重新排列

    前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun09
  • atcoder abc140E (计算贡献)

    题目链接 大意 xff1a 让你 i 61 1 n
  • AtCoder Beginner Contest 143 E.Travel by Car(最短路)

    题目链接 大意 xff1a 给你一个无向带权图 xff0c 给你一些询问点 xff0c s t s t s t xff0c 你从s出发有 l