【问题描述】     
     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环境【VIJOS1686】极品飞车相关推荐

  1. 关于java设计模式与极品飞车游戏的思考

    ------- android培训.java培训.期待与您交流! ---------- 对像我一样正在学习java的人来讲,对设计模式的学习是个很重要的环节.而我们在学习设计模式时,不仅仅应该知道它们 ...

  2. 极品飞车9计算机中丢失,极品飞车9缺少d3dx9 极品飞车9丢失d3dx926.dll解决方法

    极品飞车9系列是极品飞车系列中最经典的一款,很多玩家在运行极品飞车9的时候会遇到d3dx9_26.dll丢失的问题,那么下面小编就来为大家说一说极品飞车9丢失d3dx9_26.dll的解决方法. 方法 ...

  3. 竞速游戏经典之《极品飞车》系列完整回顾(图)

    竞速游戏经典<极品飞车>系列 在汽车出现之后,就有很多的竞速爱好者试图将马力及车辆性能推向极限,并在通过终点线的那一瞬间缔造全新记录.所以,打从有游戏机问世之后,竞速游戏的出现,一点也不令 ...

  4. 极品飞车14:热力追踪3 for Mac(赛车竞速类游戏)

    极品飞车热力追踪 Mac 特别版是一款速度与激情的竞速类的赛车游戏,极品飞车14热力追踪3 Mac版完美存档内容,让您拥有车手和警察全部技能,所有车辆赛事全部达成,让您一跃成为最强选手! 点击下载极品 ...

  5. 【Need for Speed:Hot Pursuit】极品飞车14 热力追踪 v1.0.62 官方中文 完整破解

    极品飞车最新版热力追踪终于登陆Android!炙热的竞赛让你爽翻天!游戏提供多种模式,包括警车追匪,双人竞速,有超过15种以上的特殊警车,还有全世界各大知名厂商的经典名车,感受极品飞车最新最炫最极限的 ...

  6. 《极品飞车21:热度》图文攻略

    [游戏介绍] <极品飞车:热度>是由Ghost Games制作,EA发行的<极品飞车>系列游戏新作.该系列虔诚地展现了真实赛车文化,有着出色的画面和酷炫的音效,Ghost Ga ...

  7. 为什么极品飞车服务器维修,极品飞车9主机怎么总是显示失去和局域网服务器的联系...

    满意答案 kbenqusi 2013.04.08 采纳率:54%    等级:12 已帮助:22612人 您好! 首先1确保局域网环境,这个....其实没必要说的,世人都该知道.... 2.联网机器使 ...

  8. 添加 Windows 8.1 无虚拟机启动项 解决极品飞车的不支持虚拟机报错

    在Windows 8.1 64位环境下,安装完极品飞车17后,运行程序会出现错误对话框: Sorry, this application cannot run under a Virual Machi ...

  9. 《极品飞车 地下狂飙2》秘籍

    <极品飞车 地下狂飙2>除了比上一代更好的创意之外,对车辆的行驶特性的模拟也有了长足的进步,虽然与真车还有很大的差距,但车辆的大致特性已经被完全模拟出来了.     所有内容包括:车辆模式 ...

  10. 微型计算机储存最快的是什么车,谁是《极品飞车14》的佳前挡?

    主观游戏测试 从原理来看,高刷新率对于提高液晶显示器的画面流畅度是有影响的.那么这一影响是否能在显示器上感觉得到?我们通过在两台显示器上进行测试来感受. 测试方法说明 测试样品的选择上,我们用明基新支 ...

最新文章

  1. 微信小程序换行,空格的写法
  2. [BZOJ 2839]集合计数
  3. Maven实战(Maven+Nexus建立私服【Linux系统】)
  4. MSSQL 2005 分页分析及优化(转)
  5. Default process group has not been initialized, please make sure to call init_process_group
  6. JSON Perl
  7. 从大整数乘法的实现到 Karatsuba 快速算法
  8. 获取用户真实IP以及internalProxies
  9. 使用 Hapi 开发 RESTful APIs
  10. 《终身成长》卡罗尔 德韦克_epub+mobi+azw3
  11. Maven教程-使用Nexus搭建私服,Java基础视频
  12. 纪念DOS下的经典软件
  13. 微信小程序开发之——开发者工具介绍(1.7)
  14. java实现身份证号码的严格校验!
  15. 今年新型城镇化新看点:加快户籍改革 建设新型智慧城市
  16. Python爬虫获取豆瓣电影TOP250
  17. Windows Style Builder一些路径分享-2022.8.21(不定期更新)
  18. Dirt4 Cross 游戏改装车辆(一)
  19. 无人机遥感图像语义分割数据集UAVid使用
  20. 学习笔记0521----mysql管理

热门文章

  1. 给定一个字符串str,给定一个字符串类型的数组arr,/出现的字符都是小写英文arr每一个字符串,/代表一张贴纸,你可以把单个字符剪开使用
  2. Silverlight 2发布了
  3. 集线器(Hub)和交换机(Switch)的区别
  4. 软件测试初期学习day03
  5. oracle 对两列加唯一性束_Oracle唯一约束
  6. Mac上修复Gitee错误Oauth: Access token is expired
  7. 关于一个数的因数个数 与 所有因数的和
  8. Win10如何设置护眼色
  9. Android多语言切换,字体风格,简体转繁体
  10. 讯雷封杀事件想到——借花献佛