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;
}
posted @ 2012-09-13 13:32  朝圣の路  阅读(370)  评论(0编辑  收藏  举报