本题的题意是让你求一颗生成树,使得最大边-最小边最小。
枚举最小边。kruskal求生成树的最大边。
#include <iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
using namespace std;
#define maxm 110*110
#define maxn 110
#define eps 0.000001
#define zero(x) ((fabs(x)<eps?0:x))
#define INF 99999999
struct list
{
int u;
int v;
int w;
friend bool operator < (const list &a,const list &b)
{
return a.w<b.w;
}
}edge[maxm];
int f[maxn];
int find(int x)
{
while(x!=f[x])x=f[x];
return x;
}
int main()
{
int n,m,i,j,k;
while(~scanf("%d%d",&n,&m)&&(n||m))
{
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
}
sort(edge+1,edge+m+1);
int minn=INF;
for(k=1;k<=m;k++)
{
for(i=1;i<=n;i++)f[i]=i;
int l=0;
int amin,amax;
amin=INF;
amax=-1;
for(i=k;i<=m;i++)
{
int a=find(edge[i].u);
int b=find(edge[i].v);
if(a==b)continue;
l++;
amin=min(amin,edge[i].w);
amax=max(amax,edge[i].w);
f[a]=b;
if(l==n-1)break;
}
if(l!=n-1)break;
minn=min(minn,amax-amin);
}
if(minn==INF)cout<<"-1"<<endl;
else cout<<minn<<endl;
}
return 0;
}