UVA 1395

来源:互联网 发布:阿里云服务器五折 编辑:程序博客网 时间:2024/06/16 22:47

暴力列举每个区间。跑最小生成树。

#include<cstdio>

#include<algorithm>
using namespace std;

#define N 105
#define inf 1234567890

int n,m,ans,Max,Min,Num;
int p[N];

struct Node{
    int u,v,w;
}e[N*N];

int read()
{
    int f=1,x=0;char ch=getchar();
    for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
    for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
    return x;
}

int find(int x) {return p[x]==x? x:p[x]=find(p[x]);}

int max(int A,int B) {return A>B? A:B;}

int min(int A,int B) {return A>B? B:A;}

int check(int l,int r)
{
    Max=-inf;Min=inf;Num=0;
    for (int i=1;i<=n;i++) p[i]=i;
    for (int i=l;i<=r;i++)
    {
        int fx=find(e[i].v),fy=find(e[i].u);
        if (fx!=fy)
        {
            p[fx]=fy;
            Num++;
            Max=max(Max,e[i].w);
            Min=min(Min,e[i].w);
        }
    }
    return Num==(n-1)? 1:0;
}

bool cmp(Node A,Node B) {return A.w<B.w;}

int main()
{
    for (;;)
    {
        n=read();m=read();
        if (n==0&&m==0) break;
        for (int i=1;i<=m;i++) {e[i].u=read();e[i].v=read();e[i].w=read();}
        sort(e+1,e+m+1,cmp);
        ans=inf;
        for (int l=1;l<=m;l++)
        {
            for (int r=l;r<=m;r++)
            {
                if (check(l,r)) {ans=min(Max-Min,ans);break;}
            }
        }
        if (ans!=inf) printf("%d\n",ans);else puts("-1");
    }
    return 0;
}
0 0
原创粉丝点击