题目大意:给出N个点,M条边,求出一棵包含N个点的树,且树的最大权值-最小权值 达到最小
解题思路:枚举最小边,然后依此得到生成树,这样的生成树的权值差肯定是最小的
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 110
#define M 10010
#define INF 0x3f3f3f3f
struct Edge{
int u, v, c;
}E[M];
int Min, Max, n, m;
int f[N];
void init() {
Min = INF; Max = -INF;
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].c);
Max = max(Max, E[i].c);
Min = min(Min, E[i].c);
}
}
int find(int x) {
return x == f[x] ? x : f[x] = find(f[x]);
}
int judge(int mid) {
for (int i = 1; i <= n; i++)
f[i] = i;
bool flag = false;
int xx, yy, cnt = 0, Min_val, Max_val;
for (int i = 0; i < m; i++) {
if (E[i].c >= mid) {
xx = find(E[i].u);
yy = find(E[i].v);
if (xx != yy) {
f[xx] = yy;
if (!flag)
Min_val = E[i].c;
flag = true;
Max_val = E[i].c;
cnt++;
}
}
}
if (cnt == n - 1)
return Max_val - Min_val;
return INF;
}
int cmp(const Edge &a, const Edge &b) {
return a.c < b.c;
}
void solve() {
int ans = INF;
sort(E, E + m, cmp);
for (int i = Min; i <= Max; i++) {
ans = min(ans, judge(i));
}
if (ans == INF)
ans = -1;
printf("%d\n", ans);
}
int main() {
while (scanf("%d%d", &n, &m) != EOF && n + m) {
init();
solve();
}
return 0;
}