码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1598 find the most comfortable road

时间:2015-04-11 20:36:34      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出一幅无向图,每次询问给出起点和终点,求起点到终点权值差最小的一条路,输出权值差;

思路:边按权值排序,利用并查集枚举每次能使起点终点联通的情况下权值差,并每次更新最小值;

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int fa[500010],n,m;
struct node
{
    int u,v,val;
    friend bool operator<(const node &a,const node &b)
    {
        return a.val<b.val;
    }
}arr[500010];
void init()
{
    for(int i=0;i<n;i++)
    {
        fa[i]=i;
    }
}
int fin(int x)
{
    if(fa[x]==x) return x;
    return fa[x]=fin(fa[x]);
}
void combine(int a,int b)
{
    int t1=fin(a);
    int t2=fin(b);
    if(t1!=t2)
        fa[t2]=t1;
}
int main()
{
    int i,j,k,a,b,q,ans,flag;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0;i<m;i++)
            scanf("%d%d%d",&arr[i].u,&arr[i].v,&arr[i].val);
        sort(arr,arr+m);//按速度从小到大排序
        scanf("%d",&q);
        for(i=0;i<q;i++)
        {
            scanf("%d%d",&a,&b);
            ans=INF;
            for(j=0;j<m;j++)//枚举恰能使两点联通的边数
            {
                init();
                for(k=j;k>=0;k--)
                {
                    combine(arr[k].u,arr[k].v);
                    if(fin(a)==fin(b))
                    {
                        ans=min(ans,arr[j].val-arr[k].val);//联通时,求最小差值
                    }
                }
            }
            if(ans==INF) printf("-1\n");
            else printf("%d\n",ans);
        }
    }
    return 0;
}

 

hdu 1598 find the most comfortable road

标签:

原文地址:http://www.cnblogs.com/dashuzhilin/p/4418271.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!