题意:给出一个n结点的图,求一棵生成树,使其最大边减最小边最小,并求出最小值。
思路:将所有边排序,然后暴力求最小生成树即可。
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 10000;
const int INF = 1e9 + 10;
int n, m;
int pre[maxn];
struct Edge
{
int from, to, val;
void read()
{
scanf("%d%d%d",&from,&to,&val);
}
bool operator < (const Edge& b) const
{
return val < b.val;
}
}edge[maxn];
void init()
{
for (int i = 1; i <= n; i++) pre[i] = i;
}
int find(int x)
{
return pre[x] == x ? x : pre[x] = find(pre[x]);
}
int main()
{
while(scanf("%d%d",&n,&m) == 2 && n) {
for (int i = 0; i < m; i++)
edge[i].read();
sort(edge, edge + m);
int ans = INF;
int L, R;
for (L = 0; L + n-1 <= m; L++) {
init();
int num = 1;
for (R = L; R < m; R++){
int x = find(edge[R].from), y = find(edge[R].to);
if (x != y) {
pre[x] = y;
num++;
}
if (num == n) break;
}
if (num != n) break;
else ans = min(ans, edge[R].val - edge[L].val);
}
printf("%d\n",ans == INF ? -1 : ans);
}
}