#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
int u,v,c;
}e[100010];
int pre[100010],n,m;
bool cmp(const node &a,const node &b){
return a.c<b.c;
}
int find(int x){
return x==pre[x]?x:find(pre[x]);
}
int kruskal(int x){
for(int i=0;i<=n;i++)
pre[i]=i;
int res=e[x].c,ans=0;
for(int i=x;i<m;i++){
int r1=find(e[i].u),r2=find(e[i].v);
if(r1!=r2){
ans++;
pre[r2]=r1;
if(ans==n-1){
return e[i].c-res;
}
}
}
return -1;
}
int main(){
while(scanf("%d%d",&n,&m) == 2 && (n+m)){
for(int i=0;i<m;i++){
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].c);
}
sort(e,e+m,cmp);
int res=0x3f3f3f3f;
for(int i=0;i<m;i++){
int t=kruskal(i);
if(t!=-1)
res=min(res,t);
}
if(res==0x3f3f3f3f)
printf("-1\n");
else
printf("%d\n",res);
}
}
Slim Span 求一颗生成树 使得最大边与最小边的差值最小
最新推荐文章于 2018-11-13 21:40:50 发布