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

浙公网安备 33010602011771号