题目大意:给出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;
}