Uva 1395 Slim Span(Kruskal算法)

题目链接:https://vjudge.net/problem/UVA-1395

题意

给出一个 n (n ≤ 100)结点带权图,求生成树的边权中最小的极值差。

思路

将边按权值从小到大排序,枚举边集区间的左端点。

代码

#include <bits/stdc++.h>
using namespace std;

const int M = 5500;
const int INF = INT_MAX;

int n, m, fa[M];

struct Edge{
    int u, v, w;
}e[M];

int Find(int x) {
    return x == fa[x] ? x : (fa[x] = Find(fa[x]));
}

int Kruskal(int st) {
    for (int i = 0; i < M; i++) fa[i] = i;
    int cnt = 0;
    for (int i = st; i < m; i++) {
        int x = Find(e[i].u), y = Find(e[i].v);
        if (x != y) {
            fa[x] = y;
            if (++cnt == n - 1) return e[i].w - e[st].w;
        }
    }
    return INF;
}

int main() {
    while (cin >> n >> m and (n or m)) {
        for (int i = 0; i < m; i++) cin >> e[i].u >> e[i].v >> e[i].w;
        sort(e, e + m, [] (Edge a, Edge b) {
            return a.w < b.w;
        });
        int ans = INF;
        for (int i = 0; i < m; i++) ans = min(ans, Kruskal(i));
        cout << (ans == INF ? -1 : ans) << "\n";
    }
}

代码参考自:Lazines_by 

posted @ 2020-04-25 23:47  Kanoon  阅读(147)  评论(0)    收藏  举报