hdu 1598 find the most comfortable road

http://acm.hdu.edu.cn/showproblem.php?pid=1598

才开始是我看着没什么思路,心想就用dfs暴搜试试吧(本人太爱dfs了)。结果加了各种剪枝都都是TLE无语。。最后听von说用并查集,给我讲了讲才明白,不过开始的时候把边的最大值开成点的最大值了贡献了4次wa才检查出来。。无语了,自己太马虎了。。

思路:先将各个边按限速排序,然后从最大的开始里循环用并查集建树,直到起点与终点的父亲相同说明此事s与e已经建立联系,然后用开始循环的节点的速度(该路线上的最大速速)减去最后将s,e连接的边的速度就是该路径上的Vmax-Vmin的最小了。。

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int max_s = 1007;
int f[207];
struct node
{
    int a,b,w;
}p[max_s];
int n;
int cmp(const void *a,const void *b)
{
    return (*(node*)b).w-(*(node*)a).w;
}
void init()
{
    for(int i=0;i<=n;i++)
    f[i]=i;
}
int find(int a)
{
    if(f[a]!=a)
    f[a]=find(f[a]);
    return f[a];
}
void Union(int a,int b)
{
    int x=find(a);
    int y=find(b);
    if(x!=y)
    f[y]=x;
}

int main()
{
    //freopen("d.txt","r",stdin);
    int m,i,j,op;
    while(~scanf("%d%d",&n,&m))
    {
        for(i=0;i<m;i++)
        scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].w);
        qsort(p,m,sizeof(p[0]),cmp);
        scanf("%d",&op);
        while(op--)
        {
            int s,e;
            scanf("%d%d",&s,&e);
            int min=9999999;
            for(i=0;i<m;i++)
            {
                init();
                for(j=i;j<m;j++)
                {
                    Union(p[j].a,p[j].b);
                    if(find(s)==find(e))
                    {
                        if(min>p[i].w-p[j].w)
                        min=p[i].w-p[j].w;
                        break;
                    }
                }
            }
            if(min!=9999999)
            printf("%d\n",min);
            else
            printf("-1\n");
        }
    }
    return 0;
}

  

posted @ 2011-11-23 23:43  E_star  阅读(292)  评论(0)    收藏  举报