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
| #include <bits/stdc++.h> using namespace std; typedef long long ll; #define PII pair<ll,ll> const ll N = 200000 + 50, inf = 1145141919810;
struct edge { ll u, v, len, id; } g[N];
ll n, m, dmax[N], emax[N]; ll dad[N]; vector<PII > e[N]; vector<edge> ge[N];
bool cmp(edge x, edge y) { return x.len < y.len; }
bool recmp(edge x, edge y) { return x.id < y.id; }
void add(ll x, ll y, ll len) { e[x].push_back({y, len}); e[y].push_back({x, len}); }
void gadd(ll x, ll y, ll len, ll id) { ge[x].push_back({x, y, len, id}); ge[y].push_back({y, x, len, id}); }
ll find(ll x) { while (x != dad[x]) { x = dad[x] = dad[dad[x]]; } return x; }
void merge(ll x, ll y) { x = find(x), y = find(y); dad[x] = y; }
ll check(ll x, ll y) { x = find(x), y = find(y); if (x == y) return 1; return 0; }
void dfs(ll root, ll dad) { for (auto son: e[root]) { if (son.first != dad) { dmax[son.first] = max(dmax[root], son.second); dfs(son.first, root); } } }
int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); ll T; cin >> T; while (T--) { ll u, v, len, ans = inf; cin >> n >> m; for (ll i = 1; i <= n; i++) { ge[i].clear(); e[i].clear(); } for (ll i = 1; i <= m; i++) { cin >> u >> v >> len; g[i] = (edge){u, v, len, i}; gadd(u, v, len, i); } for (ll i = 1; i <= n; i++) dad[i] = i; for (ll i = 1; i <= m; i++) emax[i] = inf; sort(g + 1, g + 1 + m, cmp); for (ll i = 1; i <= m; i++) { if (check(g[i].u, g[i].v) == 0) { add(g[i].u, g[i].v, g[i].len); merge(g[i].u, g[i].v); } } dmax[1] = 0; dfs(1, 1); sort(g + 1, g + 1 + m, recmp); for (ll from = 1; from <= n; from++) { for (auto to: ge[from]) { emax[to.id] = min(emax[to.id], dmax[from]); } } for (ll i = 1; i <= m; i++) emax[i] = max(emax[i], g[i].len); for (ll i = 1; i <= m; i++) { ans = min(ans, g[i].len + max(dmax[n], emax[i])); } cout << ans << endl; } return 0; }
|