1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
#include <bits/stdc++.h> using namespace std; const int maxn = 110; int n, m; struct l { int a, b; int val; bool operator< (const l &b) const { return val < b.val; } l() {} l(int a, int b, int v) : a(a), b(b), val(v) {} }; vector<l> line;
vector<pair<int,int>> mst[maxn]; int parent[maxn], ans1, ans2;
int logn; vector<int> dp[maxn], maxdp[maxn]; int deep[maxn];
int find(int i) { if (i == parent[i]) return i; return parent[i] = find(parent[i]); } void MST() { for (int i = 0; i <= n; i++) { parent[i] = i; mst[i].clear(); } int cnt = 0; for (auto &i : line) { int a = find(i.a); int b = find(i.b); if (a == b) continue; parent[b] = a; mst[i.a].emplace_back(make_pair(i.b, i.val)); mst[i.b].emplace_back(make_pair(i.a, i.val)); ans1 += i.val; i.val = 0; if (++cnt == n - 1) break; } } void dfs(int now, int parent, int len) { dp[now].resize(logn); maxdp[now].resize(logn); dp[now][0] = parent; maxdp[now][0] = len; for (int i = 0; i + 1 < logn; i++) { dp[now][i + 1] = dp[dp[now][i]][i]; maxdp[now][i + 1] = max(maxdp[now][i], maxdp[dp[now][i]][i]); } for (auto &i : mst[now]) { if (i.first == parent) continue; deep[i.first] = deep[now] + 1; dfs(i.first, now, i.second); } } int LCA(int a, int b) { if (deep[a] < deep[b]) swap(a, b); int mx = -1; for (int i = deep[a] - deep[b], k = 0; i; i >>= 1, k++) if (i & 1) { mx = max(mx, maxdp[a][k]); a = dp[a][k]; } if (a == b) return mx; for (int i = logn - 1; i >= 0; i--) { if (dp[a][i] != dp[b][i]) { mx = max(mx, max(maxdp[a][i], maxdp[b][i])); a = dp[a][i]; b = dp[b][i]; } } return max(max(mx, maxdp[a][0]), maxdp[b][0]); } int main() { ios::sync_with_stdio(0); cin.tie(0); int c; cin >> c; while (c--) { cin >> n >> m; line.resize(m); for (int i = 0; i < m; i++) { int a, b, v; cin >> a >> b >> v; a--; b--; line[i] = {a, b, v}; } sort(line.begin(), line.end()); ans1 = 0; ans2 = 1 << 30; MST(); logn = log2(n) + 1; dfs(0, 0, 0); for (auto &i : line) { if (!i.val) continue; ans2 = min(ans2, i.val - LCA(i.a, i.b)); } cout << ans1 << ' ' << ans1 + ans2 << '\n'; } return 0; }
|