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;

}

  

你可能感兴趣的:(table)