//思路:用结构体保存一条边的信息(u,v,w),因为是求最小的生成树,所以把边排序后,从最小的边(起点)依次枚举可以构成的生成树
AC源码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int INF=(1<<30);
int n,m,MIN_NUM=INF,p[105];
int findset(int x)
{
return p[x]==x?x:p[x]=findset(p[x]);
}
struct Edge
{
int u,v,w;
Edge(int a,int b,int c):u(a),v(b),w(c){}
bool operator<(const Edge& rhs)
{
return w<rhs.w;
}
};
vector<Edge> Evec;
void solve()
{
int len=Evec.size();
for(int i=0;i<=len-(n-1);++i)
{
int cnt=n;
for(int k=1;k<=n;++k)
p[k]=k;
for(int j=i;j<len;++j)
{
int x=findset(Evec[j].u),y=findset(Evec[j].v);
if(x!=y)
{
p[x]=y;
if(--cnt==1)
{
MIN_NUM=min(MIN_NUM,Evec[j].w-Evec[i].w);
break;
}
}
}
}
}
int main()
{
while(scanf("%d %d",&n,&m)&&n)
{
Evec.clear();
int u,v,w;
while(m--)
{
scanf("%d %d %d",&u,&v,&w);
Evec.push_back(Edge(u,v,w));
}
sort(Evec.begin(),Evec.end());
MIN_NUM=INF;
solve();
if(MIN_NUM==INF)
printf("-1\n");
else
printf("%d\n",MIN_NUM);
}
return 0;
}