题意:求出这个图的所有生成树中生成树的最长边和最短边差值最小的那个值
思路:先把所有边排序,以最小边开始求最小生成树,求出来之后求出差值,然后在以次短边求最小生成树,然后求出差值,最后求出这些所有差值中最小的差值。
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 999999999
struct edge
{
int u,v,w;
};
edge e[5000];
int f[110];
int n,m;
bool comp(edge &e1, edge &e2)
{
return e1.w < e2.w;
}
int getf(int x)
{
return x == f[x] ? x : f[x] = getf(f[x]);
}
int main()
{
while(cin >> n >> m && (n+m))
{
for(int i = 1; i <= m; ++i)
cin >> e[i].u >> e[i].v >> e[i].w;
sort(e+1,e+m+1,comp);
int res =INF;
for(int i = 1; i <= m; ++i)
{
int cnt = 0;
for(int j = 1; j <= n; ++j)
f[j] = j;
for(int j = i; j <= m; ++j)
{
if(getf(e[j].u) != getf(e[j].v))
{
f[getf(e[j].u)] = getf(e[j].v);
++cnt;
}
if(cnt == n-1)
{
res = min(res,e[j].w - e[i].w);
break;
}
}
}
if(res == INF) cout << "-1" << endl;
else cout << res << endl;
}
return 0;
}