#include <stdio.h>
#include <math.h>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<cctype>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=100+10;
//把每条边当做权最小的边,剩下的边再去便利,每次维护最大边权和最小边权差,排完序后才能保证每次枚举得的生成树最苗条
struct P
{
int from,to;
int cost;
bool operator <(const P&s)
{
return cost<s.cost;
}
} p[5000];
int par[maxn];
int N;
void init()
{
for(int i=1; i<=N; i++)
par[i]=i;
}
int find(int x)
{
return par[x]==x? x:find(par[x]);
}
bool same(int a,int b)
{
return find(a)==find(b);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
par[y]=x;
}
int main()
{
int E;
while(~scanf("%d%d",&N,&E)&&(N||E))
{
init();
int a,b,c;
for(int i=0; i<E; i++)
{
scanf("%d%d%d",&a,&b,&c);
p[i].from=a;
p[i].to=b;
p[i].cost=c;
}
sort(p,p+E);
int coun=0x7f7f7f7f;
for(int i=0; i<E; i++)
{
int maxn1=0;
int cnt=N;
init();
for(int j=i; j<E; j++)
{
if(!same(p[j].to,p[j].from))
{
unite(p[j].from,p[j].to);
cnt--;
maxn1=max(maxn1,p[j].cost);
}
}
if(cnt==1)coun=min(coun,maxn1-p[i].cost);
}
if(coun==0x7f7f7f7f)
printf("-1\n");
else
printf("%d\n",coun);
}
return 0;
}
F - Slim Span UVA - 1395
最新推荐文章于 2019-03-12 09:21:05 发布