HDU-1598 find the most comfortable road

来源:互联网 发布:oracle数据库防火墙 编辑:程序博客网 时间:2024/06/01 15:45
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
题意
XX星人要从一个城市到达另外一个城市,他对舒适度要求很高,在乘坐过程中最高速度与最低速度的差越小舒适度越高,输入输出题目里已有详细介绍,
求最佳路线的舒适度最高速与最低速的差,如果起点和终点不能到达,则输出-1。
题解
本题考查并查集和贪心算法。因为要找XX星人从一个城市到另外一个城市的最高舒适度,这可以用并查集和贪心算法来实现,通过并查集找到不同的路使XX星人从一个城市直接或间接的到达另外一个城市,然后在通过贪心算法找到最小的最大速度与最小速度的差值。如果不能到达,则输出-1。
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define INF 0x3f3f3f3fint n,m,flag,minn,f[1005];struct node{    int u;    int v;    int w;} q[1005];bool cmp(node a,node b)                //按速度大小排序{    return a.w<b.w;}void init()                             //初始化{    int i;    for(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];    }}int 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))    {        int i,j,t,s,e;        for(i=0; i<m; i++)            scanf("%d%d%d",&q[i].u,&q[i].v,&q[i].w);        sort(q,q+m,cmp);        scanf("%d",&t);        while(t--)        {            minn=INF;                       //每一次XX星人要从一个地方到另外一个地方都要把minn赋初值            scanf("%d%d",&s,&e);            //输入起点和终点            for(i=0; i<m; i++)              //从0开始,贪心算法            {                init();                     //每一次重新找路的时候都要f数组初始化                for(j=i; j<m; j++)                {                    merge(q[j].u,q[j].v);                    if(getf(s)==getf(e))   //如果从起点到达了终点                    {                        if(minn>q[j].w-q[i].w)                           minn=q[j].w-q[i].w;  //更新最小值                    }                }            }            if(minn!=INF)                printf("%d\n",minn);            else                printf("-1\n");                  //表示不能从起点走到终点        }    }    return 0;}



原创粉丝点击