zoukankan      html  css  js  c++  java
  • find the most comfortable road(hdu1598)不错的并查集

    find the most comfortable road

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

    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
     

    一道不错的并查集的题!!!

    当然,我第一次看这道题的时候,第一个想法,果断应该是并查集啊。

    思路:

    我们先把这个边按权值排序,然后从第j(j从0到m)条边开始枚举,然后枚举k边(k从j到0),如果从k到j的边能使起点和终点连通的话,那么最快速度与最慢速度的差一定是edge[j].weight - edge[k].weight,这样枚举,就可以把最小差求出来了,由于题目数据比较小,所以这样的枚举是可以过掉的。

     

    ps:http://acm.hdu.edu.cn/showproblem.php?pid=1598
     
    #include<cstdio>
    #include<cstdlib>
    #define MAX 1000001
    #define min(a,b) (a)<(b)?(a):(b)
    
    struct Edge
    {
        int from;
        int to;
        int weight;
    }edge[1005];
    
    int n,m;
    int father[1005];
    
    int find(int x)
    {
        return x == father[x] ? x : father[x] = find(father[x]);
    }
    
    void Union(int a,int b)
    {
        if(a!=b)
            father[b]=a;
    }
    
    int cmp(const void* a,const void* b)
    {
        return ((Edge*)a)->weight - ((Edge*)b)->weight;
    }
    
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            int i,j,k,t;
            for(i=0;i<m;i++)
                scanf("%d%d%d",&edge[i].from,&edge[i].to,&edge[i].weight);
            qsort(edge,m,sizeof(Edge),cmp);
            int q;
            scanf("%d",&q);
            for(i=0;i<q;i++)
            {
                int from,to;
                scanf("%d%d",&from,&to);
                int ans = MAX;
                for(j=0;j<m;j++)
                {
                    for(t=0;t<m;t++)
                        father[t]=t;
                    for(k=j;k>=0;k--)
                    {
                        Union(find(edge[k].from),find(edge[k].to));
                        if(find(from) == find(to))
                        {
                            ans = min(ans,edge[j].weight - edge[k].weight);
                        }
                    }
                }
                if(ans!=MAX)
                    printf("%d
    ",ans);
                else
                    printf("-1
    ");
            }
        }
        return 0;
    }

    不知道下面这个怎么错了,求解啊!!!

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #define MAX 1000005
    using namespace std;
    #define min(a,b) (a)<(b)?(a):(b)
    
    struct Edge
    {
        int from;
        int to;
        int weight;
    }edge[1005];
    
    int n,m;
    int father[1005];
    
    int find(int x)
    {
        while(x!=father[x])
            x=father[x];
        return x;
    }
    
    void Union(int a,int b)
    {
        if(a!=b)
            father[b]=a;
    }
    
    int cmp(const void* a,const void* b)
    {
        return ((Edge*)a)->weight - ((Edge*)b)->weight;
    }
    
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            int i,j,k,t;
            for(i=0;i<m;i++)
                scanf("%d%d%d",&edge[i].from,&edge[i].to,&edge[i].weight);
            qsort(edge,m,sizeof(Edge),cmp);
            int q;
            scanf("%d",&q);
            for(i=0;i<q;i++)
            {
                    int from,to;
                scanf("%d%d",&from,&to);
                int ans = MAX;
                for(j=0;j<m;j++)
                {
    
                    for(t=0;t<m;t++)
                        father[t]=t;
                    for(k=j;k>=0;k--)
                    {
                        Union(find(edge[k].from),find(edge[k].to));
                        if(find(from) == find(to))
                        {
                            ans = min(ans,edge[j].weight - edge[k].weight);
                        }
                    }
                }
                if(ans!=MAX)
                    printf("%d
    ",ans);
                else
                    printf("-1
    ");
            }
        }
        return 0;
    }

    不解a!

     
  • 相关阅读:
    Android官方数据绑定框架DataBinding*
    Application 使用分析*
    Android HandlerThread与IntentService*
    Android中SQLite应用详解*
    Android开发中,那些让您觉得相见恨晚的方法、类或接口*
    巧用ViewPager 打造不一样的广告轮播切换效果*
    Android-Universal-Image-Loader的缓存处理机制与使用 LruCache 缓存图片*
    Android Volley完全解析*
    Android 蓝牙*
    Android自定义View
  • 原文地址:https://www.cnblogs.com/yuyixingkong/p/3310556.html
Copyright © 2011-2022 走看看