题意:
求生成树最长边与最短边的最小差值
思路:
代码:
const int maxn=1e4+100;
struct node{
int u,v,w;
}edge[maxn];
int root[maxn],n,m;
bool cmp(node a,node b){
return a.w<b.w;
}
int Find(int x){
if(x!=root[x]) root[x]=Find(root[x]);
return root[x];
}
void init(int n){
for(int i=1;i<=n;i++) root[i]=i;
}
void solve(){
while(~scanf("%d%d",&n,&m)){
if(!n&&!m) break;
init(n);
for(int i=1;i<=m;i++){
edge[i].u=read,edge[i].v=read,edge[i].w=read;
}
sort(edge+1,edge+1+m,cmp);
int res=inf;
for(int l=1,r=1;l<=m;l++){
bool flag=0;
int cnt=0;
init(n);
for(int k=l;k<=m;k++){
int u=edge[k].u,v=edge[k].v;
int fu=Find(u),fv=Find(v);
if(fu!=fv){
root[fu]=fv;
cnt++;
}
if(cnt==n-1){
flag=1;r=k;break;
}
}
if(flag){
res=min(res,edge[r].w-edge[l].w);
//cout<<l<<" "<<r<<"***********"<<res<<endl;
r=l;
}
}
if(res==inf) puts("-1");
else cout<<res<<endl;
}
}