这题就是求一个最小生成树,最小生成树的定义为最大边-最小边最小。我们可以直接暴力的枚举最小边,然后做最小生成树。O(m2)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 110
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,m,ans=0,fa[N];
struct edge{
int x,y,val;
}e[N*N];
inline bool cmp(edge x,edge y){return x.val<y.val;}
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int main(){
// freopen("a.in","r",stdin);
while(1){
n=read();m=read();if(!n&&!m) break;ans=inf;
for(int i=1;i<=m;++i) e[i].x=read(),e[i].y=read(),e[i].val=read();
sort(e+1,e+m+1,cmp);
for(int s=1;s+n-1-1<=m;++s){
for(int i=1;i<=n;++i) fa[i]=i;int tot=0,t=s;
while(t<=m){
int xx=find(e[t].x),yy=find(e[t].y);
if(xx!=yy) fa[xx]=yy,++tot;
if(tot==n-1) break;++t;
}if(tot!=n-1) break;
ans=min(ans,e[t].val-e[s].val);
}if(ans==inf) puts("-1");
else printf("%d\n",ans);
}return 0;
}