求调,悬赏一关注
#include <iostream>
#include <algorithm>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const ll INF = 1e15;
const int MAXN = 1e5 + 5, MAXM = 3e5 + 5, MAXL = 20;
struct Edge {
int u, v, w;
bool f;
bool operator <(const Edge &i) const {
return w < i.w;
}
} e[MAXM];
int q, n, m, c[MAXN], d[MAXN], sz[MAXN], fa[MAXN][MAXL];
pii st[MAXN][MAXL];
inline int lowbit(int x) {
return x & (-x);
}
int getf(int x) {
return (fa[x][0] ? getf(fa[x][0]) : x);
}
int getd(int x) {
if (!fa[x][0]) return (d[x] = 1);
return (d[fa[x][0]] ? d[x] = d[fa[x][0]] + 1 : d[x] = getd(fa[x][0]) + 1);
}
void Merge(pii &ret, pii x) {
if (x.first > ret.first) {
ret.second = ret.first, ret.first = x.first;
if (x.second > ret.second) {
ret.second = x.second;
}
} else if (x.first < ret.first && x.first > ret.second) {
ret.second = x.first;
}
}
void init() {
for (int i = 1; i <= n; i++) {
d[i] = getd(i);
}
for (int j = 1; j < MAXL; j++) {
for (int i = 1; i <= n; i++) {
fa[i][j] = fa[fa[i][j - 1]][j - 1];
st[i][j] = st[i][j - 1];
Merge(st[i][j], st[fa[i][j - 1]][j - 1]);
}
}
}
void Find(int &x, int k, pii &ret) {
while (k) {
int v = lowbit(k);
Merge(ret, st[x][c[v]]);
x = fa[x][c[v]], k -= v;
}
}
pii Lca(int x, int y) {
pii ret = {-1, -1};
if (d[x] < d[y]) swap(x, y);
Find(x, d[x] - d[y], ret);
if (x == y) return ret;
for (int i = MAXL - 1; i >= 0; i--) {
if (fa[x][i] != fa[y][i]) {
Merge(ret, st[x][i]);
Merge(ret, st[y][i]);
x = fa[x][i], y = fa[y][i];
}
}
Merge(ret, st[x][0]);
Merge(ret, st[y][0]);
return ret;
}
void Solve() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
sz[i] = 1;
}
for (int i = 1; i <= m; i++) {
cin >> e[i].u >> e[i].v >> e[i].w;
}
sort(e + 1, e + m + 1);
ll ans = 0;
for (int i = 1; i <= m; i++) {
int u = getf(e[i].u), v = getf(e[i].v);
if (u != v) {
if (sz[u] > sz[v]) swap(u, v);
fa[u][0] = v, sz[v] += sz[u], st[u][0] = {e[i].w, -1};
ans += e[i].w, e[i].f = 1;
}
}
init();
ll k = INF;
for (int i = 1; i <= m; i++) {
if (!e[i].f && e[i].u != e[i].v) {
pii p = Lca(e[i].u, e[i].v);
if (p.first == e[i].w) {
if (p.second >= 0) {
k = min(k, ans + e[i].w - p.second);
}
} else {
k = min(k, ans + e[i].w - p.first);
}
}
}
cout << k;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
for (int i = 1, j = 0; i < MAXN; i <<= 1, j++) {
c[i] = j;
}
Solve();
return 0;
}