uva1395 Slim Span

来源:互联网 发布:c语言 while break 编辑:程序博客网 时间:2024/05/17 07:04

Slim Span

 

#include<cstdio>

#include<algorithm>

#include<iostream>

#include<cstring>

#define N 100090

#define MAXN 99999999

using namespace std;

int n,m,t=0;

int pre[N],used[N];

struct node

{

    int st,ed,val;

}e[N];

void init()

{

    for(int i=0;i<=105;i++)

    {

        pre[i]=i;

    }

    t=0;

}

int cmp(node a,node b)

{

    return a.val<b.val;

}//从小到大排序

int Find(int m)

{

    int n=m;

    while(n!=pre[n])

        n=pre[n];

    //pre[m]=n;

    return n;

}//查找根节点

void kruskal(int l)

{

    int cha=MAXN;

    for(int i=0;i<l;i++)

    {

        init();

        for(int j=i;j<l;j++)

        {

            int fx=Find(e[j].st);

            int fy=Find(e[j].ed);

 

            if(fx!=fy)

            {

                pre[fx]=fy;

                t++;

            }

            if(t==n-1)

            {

                cha=min(cha,e[j].val-e[i].val);

                break;

            }

        }

    }

    if(cha==MAXN)

        printf("-1\n");

    else

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

}

int main()

{

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

    {

        if(n==0&&m==0)

            break;

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

        {

            scanf("%d%d%d",&e[i].st,&e[i].ed,&e[i].val);

        }

        sort(e,e+m,cmp);

        kruskal(m);

    }

    return 0;

}

 

思路:遍历(暴力)。。。不要想的太复杂,不会超时的,数据很小的。从小到大生成一个最小生成树,求下差值。然后把最短的边删去,再生成一颗最小生成树,更新最小差值,知道不能生成树。如果一开始就不能生成树,直接输出-1.