find the most comfortable road HDU

来源:互联网 发布:淘宝账号如何绑定手机 编辑:程序博客网 时间:2024/06/07 02:38
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 41 2 22 3 41 4 13 4 221 31 2
Sample Output
10

思路:这个题我一直没懂,后来问了同学才

明白,主要运用贪心和并查集,先用排序,

再用并查集合并,并且用两层for循环,每一

条边都尝试一下,具体的代码中有解释。

#include<stdio.h>#include<algorithm>using namespace std;#define INF 0x3f3f3f3fint n,a[1000],m;int min(int t1,int t2){    return t1<t2?t1:t2;}struct note{    int x;    int y;    int w;} Q[10000];bool cmp(note t1,note t2){    return t1.w<t2.w;}void print(){    for(int i=1; i<=n; i++)        a[i]=-1;}int find(int x){    if(a[x]==-1)        return x;    return a[x]=find(a[x]);}void merge(int x,int y){    int tx=find(x);    int ty=find(y);    if(tx!=ty)        a[tx]=ty;}int main(){    while(~scanf("%d %d",&n,&m))    {        for(int i=0; i<m; i++)            scanf("%d %d %d",&Q[i].x,&Q[i].y,&Q[i].w);        sort(Q,Q+m,cmp);        int t,ans,a,b;        scanf("%d",&t);        while(t--)        {            scanf("%d %d",&a,&b);            ans=INF;            for(int i=0; i<m; i++)        //外层循环,尝试每一条变                    {                print();                  //初始化 a[]数组。                for(int j=i; j<m; j++)    //从i条边开始                  {                    merge(Q[j].x,Q[j].y); //合并                    if(find(a)==find(b))  //查找a,b,是否联通                    {                        ans=min(Q[j].w-Q[i].w,ans); //更新最小的差值                        break;                    }                }            }            if(ans!=INF)                printf("%d\n",ans);            else printf("-1\n");        }    }    return 0;}




原创粉丝点击