hdu 1598 并查集+暴搜

唉。。。这题太让我伤心了,看完题之后知道是最小生成树,但是却没想到暴搜,卡了好久,最后是看别人的思路才过的,感觉自己好笨啊!!!

#include"stdio.h"

#include"stdlib.h"

#define inf 999999



int n,m,fa[105];

struct node

{

    int x,y;

    int cost;

}edge[1005];



int cmp(const void *a,const void *b)

{

    node *aa=(node*)a,*bb=(node*)b;

    return aa->cost-bb->cost;

}



int find(int w)

{

    while(w!=fa[w])

        w=fa[w];

    return w;

}



int main( )

{

    int i,a,b,min,q;

    int s,e,t,j;

    while(~scanf("%d%d",&n,&m))

    {

        for(i=0;i<m;i++)

            scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].cost);

        qsort(edge,m,sizeof(node),cmp);

        scanf("%d",&q);

        while(q--)

        {

            min=inf;

            scanf("%d%d",&s,&e);

            for(i=0;i<m;i++)//从前到后枚举每一条边;

            {

                for(j=0;j<=n;j++)

                    fa[j]=j;

                for(j=i;j<m;j++)

                {

                    a=find(edge[j].x);

                    b=find(edge[j].y);

                    if(a!=b)

                        fa[b]=a;

                    if(find(s)==find(e))//直到找到一条可以使起点到达终点的边,做差;

                    {

                        t=edge[j].cost-edge[i].cost;

                        if(min>t)

                            min=t;

                        break;

                    }

                }

                if(j==m)

                    break;

            }

            if(min==inf)

                printf("-1\n");

            else

                printf("%d\n",min);

        }

        

    }

    return 0;

}

你可能感兴趣的:(HDU)