题目:Slim Span
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
#include<sstream>
#include<queue>
#include<set>
using namespace std;struct Edge {int x,y,z;Edge() {}Edge(int one,int two,int three) {x=one,y=two,z=three;}bool operator <(const Edge& other) const {if(z<other.z||(z==other.z&&x<other.x)||(z==other.z&&x==other.x&&y<other.y)) return true;return false;}
};int n,m;
Edge a[5000];
int fa[105]= {0};
int ans;int find(int x) {if(fa[x]==-1) return x;return fa[x]=find(fa[x]);
}void make() {ans=(1<<30);for(int i=1; i<=m; i++) {memset(fa,-1,sizeof(fa));int s1=(1<<30),s2=0;int cnt=0;for(int j=i; j<=m; j++) {int f1=find(a[j].x),f2=find(a[j].y);if(f1==f2) continue;s1=min(a[j].z,s1),s2=max(a[j].z,s2);fa[f1]=f2;cnt++;if(cnt==n-1) {ans=min(ans,s2-s1);break;}}}
}void readin() {for(int i=1; i<=m; i++) {scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);}sort(a+1,a+m+1);
}int main() {while(~scanf("%d%d",&n,&m)&&(n!=0||m!=0)) {readin();make();if(ans==(1<<30)) printf("-1\n");else printf("%d\n",ans);}return 0;
}