#include <iostream>
#include <memory.h>
using namespace std;
const int M=10000000;
struct edge
{
int u,v,len;
};
int pre[101];
edge T[10000];
int m,n,slimness;
int cmp(const void *a,const void *b);
int father(int s);
int slim(int s);
int full(int s);
int main()
{
int i,j,k;
while(cin>>n>>m)
{
if (!m&&!n)
return 0;
for (i=1;i<=m;i++)
cin>>T[i].u>>T[i].v>>T[i].len;
T[0].len=0;
qsort(T,m+1,sizeof(edge),cmp);
slimness=M;
for (i=1;i<=m-n+2;i++)
if (full(i))
{
k=slim(i);
if (k!=-1&&k<slimness)
slimness=k;
}
if (slimness==M)
cout<<-1<<endl;
else
cout<<slimness<<endl;
}
return 0;
}
int cmp(const void *a,const void *b)
{
return ((edge *)a)->len-((edge *)b)->len;
}
int full(int s)
{
int k,i;
memset(pre,0,(n+1)*sizeof(int));
for (i=s,k=0;i<=m&&k<n;i++)
{
if (!pre[T[i].u])
{
pre[T[i].u]=1;
k++;
}
if (!pre[T[i].v])
{
pre[T[i].v]=1;
k++;
}
}
if (k==n&&T[i-1].len-T[s].len<slimness)
return 1;
else
return 0;
}
int father(int s)
{
while (pre[s])
{
s=pre[s];
}
return s;
}
int slim(int s)
{
int i,k,last;
memset(pre,0,(n+1)*sizeof(int));
for (i=s,k=1;i<=m&&k<n&&T[i].len-T[s].len<slimness;i++)
if (father(T[i].u)!=father(T[i].v))
{
k++;
last=i;
pre[father(T[i].v)]=father(T[i].u);
}
if (k==n)
return T[last].len-T[s].len;
else
return -1;
}
POJ3522 Slim Span
最新推荐文章于 2019-10-06 08:14:19 发布