HDU -1598 find the most comfortable road

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

这道题给出了m条路,找出寻路a(起) 到 b(终) 最佳路线的舒适度最高速与最低速的差。需要运用并查集,枚举法和贪心相结合
先将输入的限速数据存入结构体里再进行从小到大进行排序,然后在进行枚举查找最小的值,每次找的时候并查集记得初始化。当然找的时候应该从j = i点开始,不然就少了一组数据
#include<stdio.h>
#include<algorithm>        //对结构体进行排序的头文件
using namespace std;
#define inf 0x3f3f3f3f
int m,n,f[2010];

struct note
{
    int u,v,w;
} e[10010];              //注意数组的大小,不要和n范围给弄混了

int cmp(note a,note b)   //结构体进行从小到大排序
{
    return a.w < b.w;
}

void init()              //并查集初始化
{
    for(int i = 1; i <= n; i++)
        f[i] = i;
}

int getf(int v)         //并查集找祖先的递归函数
{
    if(f[v] == v)
        return v;
    else
    {
                       //路径压缩,在每次返回函数的时候,把它的值改为其祖先
        f[v] = getf(f[v]);
        return f[v];
    }
}

void merge(int v,int u)                 //并查集 合并两 子集合的函数
{
    int t1,t2;
    t1 = getf(v);
    t2 = getf(u);
    if(t1 != t2)                       //判断这两个点是否在同一个集合中
        f[t2] = t1;
}

int main()
{
    while(~scanf("%d%d",&n,&m))         //n表示的是村庄的数目,  m表示的是道路数
    {
        for(int i = 0; i < m; i++)
            scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
        sort(e,e+m,cmp);                //两个村庄的距离进行从近到远排序
        //并查集初始化
        int t,p,q,minn;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&p,&q);
            minn = inf;
            for(int i = 0; i < m; i++)     //枚举法,找出所有情路况最优解
            {
                init();
                for(int j = i; j < m; j++) //从j点开始,找出能连通p、q的路
                {
                    merge(e[j].u,e[j].v);
                    if(getf(p) == getf(q))
                    {
                        minn = min(minn,(e[j].w - e[i].w));
                        break;
                    }
                }
            }
            if(minn == inf)
                printf("-1\n");
            else
                printf("%d\n",minn);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Qin7_Victory/article/details/75576774