zoukankan      html  css  js  c++  java
  • 最舒适的路(并查集+枚举)(hdu1598)

    hdu1598

    find the most comfortable road

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 3300    Accepted Submission(s): 1406


    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
     


    分析:我们先按速度从小到大排序,再利用枚举法找到速度之差最小

    程序:

    #include"string.h"
    #include"stdio.h"
    #define M 211
    #define inf 999999999
    #include"stdlib.h"
    struct st
    {
        int u,v,w,next;
    }edge[M*30];
    int head[M],f[M],n,t;
    int finde(int x)
    {
        if(x!=f[x])
            f[x]=finde(f[x]);
        return f[x];
    }
    void make(int a,int b)
    {
        int x=finde(a);
        int y=finde(b);
        if(x!=y)
            f[x]=y;
    }
    void init()
    {
        t=0;
        memset(head,-1,sizeof(head));
    }
    void add(int u,int v,int w)
    {
        edge[t].u=u;
        edge[t].v=v;
        edge[t].w=w;
        edge[t].next=head[u];
        head[u]=t++;
    }
    int cmp(const void *a,const void *b)
    {
        return (*(struct st*)a).w-(*(struct st*)b).w;
    }
    int main()
    {
        int m,i,j;
        while(scanf("%d%d",&n,&m)!=-1)
        {
            init();
            while(m--)
            {
                int a,b,c;
                scanf("%d%d%d",&a,&b,&c);
                add(a,b,c);
            }
            qsort(edge,t,sizeof(edge[0]),cmp);
            int Q;
            scanf("%d",&Q);
            while(Q--)
            {
                int ss,tt;
                scanf("%d%d",&ss,&tt);
                int ans=inf;
                for(i=0;i<t;i++)
                {
                    for(j=1;j<=n;j++)
                        f[j]=j;
                    for(j=i;j<t;j++)
                    {
                        int u=edge[j].u;
                        int v=edge[j].v;
                        make(u,v);
                        if(finde(ss)==finde(tt))
                        {
                            if(ans>edge[j].w-edge[i].w)
                                ans=edge[j].w-edge[i].w;
                            break;
                        }
                    }
                }
                if(ans<inf)
                printf("%d
    ",ans);
                else
                    printf("-1
    ");
            }
        }
    }
    



  • 相关阅读:
    NTP on FreeBSD 12.1
    Set proxy server on FreeBSD 12.1
    win32 disk imager使用后u盘容量恢复
    How to install Google Chrome Browser on Kali Linux
    Set NTP Service and timezone on Kali Linux
    Set static IP address and DNS on FreeBSD
    github博客标题显示不了可能是标题包含 特殊符号比如 : (冒号)
    server certificate verification failed. CAfile: none CRLfile: none
    删除文件和目录(彻底的)
    如何在Curl中使用Socks5代理
  • 原文地址:https://www.cnblogs.com/mypsq/p/4348252.html
Copyright © 2011-2022 走看看