• find the most comfortable road 贪心&&枚举(并查集)


    Problem Description
    XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流,每条SARS都对行驶在上面的Flycar限制了固定的Speed,同时XX星人对 Flycar的“舒适度”有特殊要求,即乘坐过程中最高速度与最低速度的差越小乘坐越舒服 ,(理解为SARS的限速要求,flycar必须瞬间提速/降速,痛苦呀 ),
    但XX星人对时间却没那么多要求。要你找出一条城市间的最舒适的路径。(SARS是双向的)。
     
    Input
    输入包括多个测试实例,每个实例包括:
    第一行有2个正整数n (1<n<=200)和m (m<=1000),表示有N个城市和M条SARS。
    接下来的行是三个正整数StartCity,EndCity,speed,表示从表面上看StartCity到EndCity,限速为speedSARS。speed<=1000000
    然后是一个正整数Q(Q<11),表示寻路的个数。
    接下来Q行每行有2个正整数Start,End, 表示寻路的起终点。
     
    Output
    每个寻路要求打印一行,仅输出一个非负整数表示最佳路线的舒适度最高速与最低速的差。如果起点和终点不能到达,那么输出-1。
     
    Sample Input
    4 4
    1 2 2
    2 3 4
    1 4 1
    3 4 2
    2
    1 3
    1 2
     
    Sample Output
    1
    0
    ***************************************************************************************************************************
    程序中有解释
    ***************************************************************************************************************************
     1 /*
     2 贪心排序&&枚举每次并查集形成的树,并比较输出结果
     3 */
     4 #include<iostream>
     5 #include<string>
     6 #include<cstring>
     7 #include<cstdio>
     8 #include<cmath>
     9 #include<algorithm>
    10 using namespace std;
    11 const int inf=1<<30;
    12 int fa[1001],n,m,a,b,i,j,k,Q;
    13 struct edge
    14 {
    15     int u,v,w;
    16 }e[10001];
    17 bool cmp(edge a,edge b)
    18 {
    19     return a.w<b.w;
    20 }
    21 void init()
    22 {
    23     int it;
    24     for(int it=0;it<=n;it++)
    25       fa[it]=it;
    26 }
    27 int find(int x)//寻找祖先节点并更新相应链上的节点的祖先
    28 {
    29     int r=x;
    30     while(r!=fa[r])r=fa[r];
    31     while(x!=r)
    32     {
    33         int temp=fa[x];
    34         fa[x]=r;
    35         x=temp;
    36     }
    37     return r;
    38 }
    39 void Unon(int a,int b)//并查集的并(没有优化)
    40 {
    41     int x=find(a);
    42     int y=find(b);
    43      if(x==y)return;
    44      fa[x]=y;
    45 }
    46 int main()
    47 {
    48     while(scanf("%d %d",&n,&m)!=EOF)
    49     {
    50         for(i=0;i<m;i++)
    51           scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
    52         sort(e,e+m,cmp);//从小到大排序
    53         //for(i=0;i<m;i++)
    54          //printf("w:: %d ",e[i].w);
    55         //printf("
    ");
    56         scanf("%d",&Q);
    57         while(Q--)
    58         {
    59             bool gs;
    60             int ans=inf,k=0;
    61             scanf("%d%d",&a,&b);
    62             for(i=0;i<m;i++)
    63             {
    64               init();//每次比较,每次更新
    65               gs=false;
    66               for(j=i;j<m;j++)
    67               {
    68                 Unon(e[j].u,e[j].v);
    69                 if(find(a)==find(b))//找到跳出(原因因为排序)
    70                 {
    71                    gs=true;
    72                    k=j;
    73                    break;
    74                 }
    75               }
    76               if(!gs)break;
    77               ans=min(ans,e[k].w-e[i].w);
    78               //cout<<"ans:: "<<ans<<endl;
    79            }
    80            if(ans==inf)
    81             printf("-1
    ");
    82            else
    83              printf("%d
    ",ans);
    84         }
    85     }
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    第十三周课程总结
    第十二周学习总结
    第十一周课程总结
    第十周课程总结
    第九周课程总结&实验报告(七)
    第八周课程总结&实验报告(六)
    第七周课程总结&实验报告(五)
    第六周学习总结&java实验报告四
    课程总结
    第十四周学习总结&课程实验报告
  • 原文地址:https://www.cnblogs.com/sdau--codeants/p/3408381.html
Copyright © 2020-2023  润新知