CPP环境【VIJOS1686】极品飞车

cpp视频课程4 C++视频课程 立即下载
【问题描述】     
     FC星有许多城市,城市之间通过一种奇怪的双向高速公路进行交流,每条公路都对行驶在上面的飞车限制了固定的速度,同时FC星人对飞车的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服,但对时间却没那么多要求。要注意的是FC人的飞车能瞬间提速或降速。现在需要你找出一条城市间的最舒适的路径。

【输入格式】         
  第一行有2个正整数N和M,表示有N个城市和M条双向高速公路。接下来的M行,每行是三个正整数x,y,speed,分别表示城市x、y间的高速公路上飞车必须以speed速度行驶。第m+2行是一个正整数Q,接下来Q行每行有2个正整数x,y,表示询问城市x到y之间限制的固定速度。
          
【输出格式】         
  有Q行,对应输入的Q个查询,第i行的整数表示对应查询的两个城市间的最高速与最低速的差的最小值,如果两个城市不能到达则输出-1。
          
【输入样例】         
6 7
1 2 8
1 4 7
2 3 1
3 4 9
3 6 5
4 5 3
5 6 10
2
1 6
2 5

          
【输出样例】         
4
5

【数据范围】           
1<N<=300
M<=25000
Q<1000
0<=speed<=1000000000

【思路梳理】
这个题要求的是查找一条从出发城市到目的地城市之间的路径,使得该路径上最大权值和最小权值之间的差最小。涉及到搜索这样的路径的问题,首先想到的应该就是并查集:通过不断地将边按照一定顺序加入到空边图中,使得出发城市和目的地城市之间相互连通。既然所求的是边权的差值最小,那么可以通过枚举的方法,将路径上最小的显然我们有先将每一条边按照权值由小到大排序后,依次枚举限制速度最小、第二小、第三小,etc的边判断此时出发城市与目的地城市是否连通,若成立则记录下此时两者的差值。具体如下:

step1 从最小边开始,依次由小到大向空边图中添加,当添加到第j条边时,x和y属于同一个集合,表示已经添加的边能使x到达y,则令ans=min(ans,w[j]-w[1]);
step2从第二小边开始,依依次由小到大向空边图中添加,当添加到第j条边时,x和y属于同一个集合,表示已经添加的边能使x到达y,则令ans=min(ans,w[j]-w[2]);
......

最后的ans 为x到y路径上边差最小值的。
考虑一些特殊情况:目的地与出发城市为同一个顶点或者两者只有一条边连接,此时边的权值差为0。若两者始终不能够连通,那么就应当输出-1.
给出代码如下:

【CPP代码】
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 305
#define maxm 25005
#define inf 1000000005
using namespace std;
struct edge
{
    int u,v,w;
};
vector<edge>E;
int n,m,q,fa[maxn];

int find(int x)
{
    if(fa[x]==x)    return x;
    int root=find(fa[x]);
    fa[x]=root;
    return root;
}

void Union(int a,int b)
{
    fa[find(a)]=find(b);
}

void initial()
{
    for(int i=1;i<=n;i++)    fa[i]=i;
}

bool cmp(edge a,edge b)
{
    return a.w<b.w;
}

int calc(int s,int d)
{
    int ans=inf;
    for(int i=0;i<E.size();i++)
    {
        initial();
        for(int j=i;j<E.size();j++)
        {
            int x=E[j].u,y=E[j].v;
            Union(x,y);
            if(find(s)==find(d))
            {
                ans=min(ans,E[j].w-E[i].w);
                break;
            }
            if(find(s)!=find(d) && j==E.size()-1)    return ans;//强大的剪枝:当某个时刻枚举完了所有的边之后,出发城市和目的地城市始终不能连通,说明某条必须的边已经枚举过,此时直接return即可
        }
    }
    return ans;
}

int main()
{
    //freopen("in.txt","r",stdin);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        E.push_back((edge){a,b,c});
    }
    
    sort(E.begin(),E.end(),cmp);
    
    cin>>q;
    while(q--)
    {
        int s,d;
        scanf("%d%d",&s,&d);
        if(s==d){printf("0\n");continue;}
        int cnt=calc(s,d);
        if(cnt!=inf)    printf("%d\n",cnt);
        else printf("-1\n");
    }
    return 0;
}
放置准备 准备 立即下载

相关推荐

cpp 04 Control

cpp htp 第七版 ch04 课件,纯属个人资料,拿出来与大家分享,有不足还请各位大大指出!谢谢

【训练题】极品飞车 (并查集)

【问题描述】   FC星有许多城市,城市之间通过一种奇怪的双向高速公路进行交流,每条公路都对行驶在上面的飞车限制了固定的速度,同时FC星人对飞车的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服,但对时间却没那么多要求。要注意的是FC人的飞车能瞬间提速或降速。现在需要你找出一条城市间的最舒适的路径。【输入格式】   第一行有2个正整数N(1#include<cstdio>

7cqyz_Ycz的博客 472

jni.rar_cpp944_图像识别

一个asift.cpp源码,生成asift.dll,用于图像识别算法sift,进行图片的识别

cpp 9.4

9.4 #include void oil(int x); int main() { using namespace std; int texas = 31; int year = 2011; cout << "In main(), texas = " << texas << ", &texas = "; cout << &texas << endl; cout << "In ma

rocvfx的博客 495

LZMAzip_lzmacpp_lzmac++_lzma_whichbps_Vc_

LZMA 压缩及解压缩算法的 C++ 源代码,包括了编码器及解码器的 C++ 源码

VSCode关联VIVADO编辑Verilog

有时候接手别人的代码,或者从网上找的开源代码,每个人风格不一致,对齐缩进也不一样,阅读起来很累。有没有什么方法能快捷地格式化代码呢。下面我们利用VSCode插件来实现这个需求。Vivado是Xilinx公司提供的逻辑开发平台(之一),如果不喜欢Vivado自带的文本编辑器,可以选择第三方的文本编辑器VSCode。

小王在努力...的博客 7150

变量定义

1.初始化: 用一个变量去赋值其他变量时,必须确保这个变量已经定义。 2.初始化方式: (1)int a = 0; (2)int a = {0}; (3)int a {0}; (4)int a (0); 3.默认初始化 定义于任何函数体之外的变量被默认初始化为0,定义于函数体内部的内置类型变量将不被默认初始化。 每个类各自决定其初始化对象的方式,而且,是否允许不经初始化就定义对象也由类决定。如果类允许这种行为,它将决定对象的初始值到底是什么。 绝大多数类都支持无须显示初始化而定义对象,这样的类提供了一个合适

myfriend12的博客 625

数字IC时序约束实战:深入解析clock_uncertainty的设置策略与后端影响

本文深入探讨数字IC设计中clock_uncertainty的设置策略及其对后端实现的影响。通过分析时钟不确定度的组成(包括clock_skew、clock_jitter和margin),并结合实际项目经验,详细介绍了在不同设计阶段(综合、布局布线、签核)的动态调整方法。文章还提供了工程化处理参数来源、跨时钟域特殊处理以及优化时序收敛的实用技巧,帮助工程师提升数字IC设计的可靠性和性能。

weixin_29284657的博客 227

1407290847-hd-海选女主角.cpp

#include int s[100][100][2],c[100][100][2]; int main() {  int i,j;  int m,n;  int minm,minn;  int minf;  while(scanf("%d%d",&m,&n)==2)  {   minf=-1;   for(i=0;i       for(j=0;j    {    

网络二师兄 536

医学图像分割评价指标详解:从Dice到MSD的实战解析

本文深入解析医学图像分割的核心评价指标,从最常用的Dice相似系数到衡量边界精度的MSD(最大对称表面距离),通过实战案例与代码演示,系统阐述各指标的计算原理、应用场景及临床意义,帮助读者全面评估模型性能。

weixin_29070721的博客 593

告别Sourceforge安装器!手把手教你下载MinGW-w64离线包并配置环境变量(Windows 10/11)

本文详细介绍了如何在Windows 10/11系统上通过下载MinGW-w64离线包并配置环境变量,完全绕过Sourceforge安装器的问题。从选择正确的版本、解压到本地目录,到设置系统环境变量和验证编译环境,手把手指导开发者快速搭建稳定的GCC编译环境,解决常见的安装困扰。

weixin_30896825的博客 336

项目随记:8250-Oneplus

Oneplus-OP8/OP8Pro-骁龙865-上海高通 grep -nrsiE "op_ext|E CHIUSECASE|OPScreenshotHelper|Stopping current Feature|OnProcessRequest failed with result|ExecuteProcessRequest failed with result|f debug|Last picture frame consumed|Add frame|Picture frame received|wr

shizhong2006的专栏 3349

C# .NET6 TesseractOCR 图片文字识别

在你的项目中的tessdata-main文件夹找到这几个文件,并右键->属性设置为【如果较新则复制】有几个需要用到的模型,需要生成的时候复制到输出目录中,在项目中设置即可。TesseractOCR兼容 x86 与 x64。附 :ImageUtils.RegionCropping()源码。Visual Studio 2022 社区版。下载完成后解压在你的项目中,如图所示。从官方项目中获取模型数据, 网址为。

qq_44121554的博客 3851

nyoj-944-蚂蚁的腿

#include int a[1000005]={0}; int main() {  int i,j,n,s;  a[1]=1;  for(i=2;i   for(j=i+i;j    a[j]=1;   scanf("%d",&s);   while(s--)   {    scanf("%d",&n);    if(n==0) printf("6\n");    e

u011514451的专栏 558

21、时间触发以太网:通信、诊断、故障隔离与参数化详解

本文详细解析了时间触发以太网(TTEthernet)的核心机制,包括团检测算法、诊断服务、故障隔离策略、配置服务以及协议参数化等内容。TTEthernet是一种专为超高可靠性系统设计的网络技术,广泛应用于航空航天、工业自动化和汽车电子等领域。文章还探讨了其未来发展趋势,如技术创新与生态建设,为开发者、企业和研究机构提供了应用与发展的方向。

efc12345678的博客 110

【2025年华为秋招(AI)-11月19日-第二题(200分)- 终端款型聚类识别】(题目+思路+Java&C++&Python解析+在线测试)

该摘要总结了题目要求、输入输出格式、KMeans算法的实现步骤以及关键点。以下是150字内的摘要: 本文提出基于KMeans算法对终端型号进行聚类的方法。通过包间隔时长、连接持续时长、漫游前后信号强度4个特征,使用欧氏距离度量相似度。算法采用固定初始化策略(前k个样本作为初始质心),经过分配-更新迭代,直至质心移动小于1e-8或达到最大迭代次数。最终输出各簇样本数并按升序排列,解决了终端型号自动分类问题。示例显示该方法能有效识别3-4类终端,并准确统计每类数量。

m0_73659489的博客 141

C++开发利器devcpp4.9需要MINGW老版本的必备

DEVCPP使用开源MINGW作为编译工具,非常适合C++入门新手使用. 4.9比较老的版本,也适合大中院校各种老爷机器,方便学生考试使用. 配置MINGW比较老,但是却是离线完整包.不用使用现在流行的MINGW-INST.EXE在线安装, 总体来说编译CPP非常方便. http://traffic189.com/f-77.html ...

aeaxea43的博客 729

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

极品飞车(并查集+枚举)

极品飞车(并查集+枚举) Hecy被FC星人劫持了! “长的帅也是一种罪过吗?”,Hecy问劫持他的生物,结果被暴打。唉,原来Hecy被劫持的原因是FC星人看中了他的编程才能(“我真的长的不帅吗?”Hecy不死心地问另一个生物,结果再次被暴打)。 FC星有许多城市,某些城市之间无法直接到达,但某些城市之间可以通过一种奇怪的高速公路SARS(Super Air Roam St...

weixin_30634661的博客 255

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

训练题 极品飞车(并查集应用) 解题报告

【问题描述】        FC星有许多城市,城市之间通过一种奇怪的双向高速公路进行交流,每条公路都对行驶在上面的飞车限制了固定的速度,同时FC星人对飞车的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服,但对时间却没那么多要求。要注意的是FC人的飞车能瞬间提速或降速。现在需要你找出一条城市间的最舒适的路径。         【输入格式】        第一行有

cqyz_holiday的博客 634

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

hdu 1598 极品飞车 (并查集+贪心)

【问题描述】   FC星有许多城市,城市之间通过一种奇怪的双向高速公路进行交流,每条公路都对行驶在上面的飞车限制了固定的速度,同时FC星人对飞车的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服,但对时间却没那么多要求。要注意的是FC人的飞车能瞬间提速或降速。现在需要你找出一条城市间的最舒适的路径。 【输入格式】   第一行有2个正整数N(1   第m+2行是一

wx_t91的博客 403

微信公众号开发(2)

微信公众号可以收到用户发送的6种基本信息。包括文本信息,图片信息,语音信息,视频消息,小视频消息,地理位置消息,链接消息。并且在收到用户消息之后可以设置自动回复用户消息 回复的也是6种消息 1 回复文本消息   12345678 这个请求是通过用户发送给微信服务器,微信服务器将信息

Cpp_theroad的博客 859

CPP语言系列--视频精讲

尹成老师带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!

上一篇: cpp环境【VIJOS1698】导游
下一篇: Cpp环境【BZOJ1626】【Usaco2007 Dec】【Vijos 1693】 修建道路
cqyz_Lebmond
博客等级 码龄10年 18粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值