hdu1598

思路:对所有路径的速度从小到大排个序,然后枚举高度差就ok......

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define M 1<<30
struct node
{
    int v1,v2;
    int dis;
}s[2000];
int father[2000];
int find(int x)
{
    while(x!=father[x])
    x=father[x];
    return x;
}
int cmp(const node a,const node b)
{
    if(a.dis<b.dis)
    return 1;
    else   return 0;
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)>0)
    {
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&s[i].v1,&s[i].v2,&s[i].dis);
        }
        sort(s,s+m,cmp);
        int q;
        scanf("%d",&q);
        while(q--)
        {
            int tmp,tmp1;
            int minx=M;
            scanf("%d%d",&tmp,&tmp1);
            for(int i=0;i<m;i++)
            {
                for(int k=0;k<=n;k++)
                father[k]=k;
                for(int j=i;j<m;j++)
                {
                    int x=find(s[j].v1);
                    int y=find(s[j].v2);
                    if(x!=y)
                    father[x]=y;
                    if(find(tmp)==find(tmp1))
                    {
                        if(minx>(s[j].dis-s[i].dis))
                        {
                            minx=s[j].dis-s[i].dis;
                        }
                        break;
                    }
                }
            }
            if(minx>=M)
            printf("-1
");
            else
            printf("%d
",minx);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/ziyi--caolu/p/3476812.html