zoukankan      html  css  js  c++  java
  • 【最短路】Flycar

    版权声明:本篇随笔版权归作者Etta(http://www.cnblogs.com/Etta/)所有,转载请保留原地址!

    一.问题描述

    Hecy被FC星人劫持了!

    “长的帅也是一种罪过吗?”,Hecy问劫持他的生物,结果被暴打。唉,原来Hecy被劫持的原因是FC星人看中了他的编程才能(“我真的长的不帅吗?”Hecy不死心地问另一个生物,结果再次被暴打)。

    FC星 有许多城市,某些城市之间无法直接到达,但某些城市之间可以通过一种奇怪的高速公路SARS(Super Air Roam Structure 超级空中漫游结构)进行人员或物资的交流运输。在SARS上有且仅有一种“车”可以行驶,那就是传说中的极品飞车Flycar。东东们就是乘坐着Flycar在SARS上运动的。与地球相似地,每条SARS都对行驶在他上面的Flycars有限速要求——不同的是这既不是限最高速,也不是限最低速,而是限固定速,也就是说Flycars必须以所限速度行驶,否则就要被TS(Traffic System)来一次ts(tiger strike虎击)——这可不是好玩的!

    同时FC星人对flycar的“舒适度”也有特殊的要求。他们认为乘坐一次flycar过程中,flycar达到的最高速与最低速之间的差越小,本次乘坐越舒适(可以理解,因为SARS的限速要求,flycar都必须瞬间提/降速,痛苦啊)——FC星人对时间却没那么多要求。

    因此Hecy的任务就明确了:为FC星上几乎垄断了flycar市场的全星通用汽车公司(CC)设计新一代自动寻路flycar,使得该flycar能自动寻找两城市间最舒适的到达路径。

    任务 对于给定的公路网以及两个城市s、t,求出从s到t的最舒适路径。

    输入输出格式

    输入格式:

    输入 输入数据的第一行两个正整数n、m(1<=n〈=200,1〈=m<=1000),n、m分别表示城市数和公路数。

    接下来的m行每行三个正整数i、j、num(num〈=1000000),表示城市I,j之间有一条道路,该路的限速为num.

    接下来输入整数t,表示t组询问。

    每组询问给出两个正整数s、t,表示初始城市和目标城市。

    输出格式:

    输出 每组询问输出最舒适值。

    输入输出样例

    输入样例#1

    2 1

    1 2 1

    1

    1 2

    输出样例#1

    0

    二.问题分析

           看到这道题就去codevs刷1001舒适的路线了……

           利用并查集,有顺序地循环枚举最大最小路径,求出答案即可。

    三.解决问题

    1.给边从小到大排序

    2.for(i:1~m)+for(j:i~m)遍历每一条边,若边两端点不再同一集合内则合并两点,若合并后st与en在同一集合内,更新答案并break

    Tip:其实题目不完整,无法到达是要输出-1的(⊙o⊙)…

     

     

    四.代码实现

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 const int A=205,B=1005,inf=5e8;
     6 
     7 int n,m,sum,minn,maxn=inf,st,en;
     8 int i,j,x,y,z,k,s,t,ans1=inf,ans2=0;
     9 bool bo;
    10 int fa[A],ex[A],ans[A];
    11 struct  edge{
    12     int from,to,len;
    13 }e[B];
    14 
    15 void build(int x,int y,int z)
    16 {
    17     ++sum;
    18     e[sum].from=x;
    19     e[sum].to=y;
    20     e[sum].len=z;
    21 }
    22 
    23 bool comp(edge x,edge y)
    24 {
    25     return x.len<y.len;
    26 }
    27 
    28 int find(int x)
    29 {
    30     if(x!=fa[x])fa[x]=find(fa[x]);
    31     return fa[x];
    32 }
    33 
    34 void un(int x,int y)
    35 {
    36     x=find(x);
    37     y=find(y);
    38     fa[x]=y;
    39 }
    40 
    41 int main()
    42 {
    43     scanf("%d%d",&n,&m);
    44     for(i=1;i<=m;++i)
    45     {
    46         scanf("%d%d%d",&x,&y,&z);
    47         build(x,y,z);
    48     }
    49     sort(e+1,e+m+1,comp);
    50     scanf("%d",&t);
    51     for(int g=1;g<=t;++g)
    52     {
    53         scanf("%d%d",&st,&en);
    54         ans1=inf;
    55         ans2=0;
    56         for(i=1;i<=m;++i)
    57         {
    58             minn=e[i].len;
    59             maxn=inf;
    60             for(j=1;j<=n;++j)fa[j]=j;
    61             for(j=i;j<=m;++j)
    62             {
    63                 if(find(e[j].from)==find(e[j].to))continue;
    64                 un(e[j].from,e[j].to);
    65                 if(find(st)==find(en))
    66                 {
    67                     maxn=e[j].len;
    68                     if(maxn-minn<ans1-ans2)
    69                     {
    70                         ans1=maxn;
    71                         ans2=minn;
    72                     }
    73                     break;
    74                 }
    75             }
    76         }
    77         if(ans1==inf)printf("-1
    ");
    78         else
    79         printf("%d
    ",ans1-ans2);
    80     }
    81     return 0;
    82 }

                                                                                                                           ——Etta

  • 相关阅读:
    华为云发送邮件
    activiti act_re_model 分析
    tengine upstream
    zuul压力测试与调优
    idea 快捷键
    kubernetes helm
    编写高质量代码–改善python程序的建议(二)
    编写高质量代码--改善python程序的建议(一)
    总结OpenvSwitch的调试经验
    提高SDN控制器拓扑发现性能
  • 原文地址:https://www.cnblogs.com/Etta/p/6349237.html
Copyright © 2011-2022 走看看