求大佬们帮我看看,万分感谢。
#include<bits/stdc++.h>
#define int long long
//I'm too lazy.
using namespace std;
const int N = 1e6 + 10;
int n, m, fa[N], sum, d[N], f[N][21], g[N][21], h[N][21];
// g[i][j] 从 i 跳 2^j 的最大值 h[i][j] 从 i 跳 2^j 的次大值
bool vis[N];
struct edge{int u, v, w;}a[N];
bool operator < (edge x, edge y){
return x.w < y.w;
}
struct Edge{int y, v;};
vector <Edge> G[N];
int find(int k) {
return k == fa[k] ? k : fa[k] = find(fa[k]);
}
void kruskal() {
sort (a + 1, a + m + 1);
for (int i = 1; i <= n; i++) fa[i] = i;
int res = 0;
for (int i = 1; i <= m; i++) {
if (find (a[i].u) != find (a[i].v)) {
vis[i] = 1; res ++; sum += a[i].w;
fa[find(a[i].u)] = find(a[i].v);
G[a[i].u].emplace_back(Edge{a[i].v, a[i].w});
G[a[i].v].emplace_back(Edge{a[i].u, a[i].w});
}
if (res == n - 1) break;
}
}
int ask(int a, int b, int c, int d) {
int maxx = max (c, d);
if (a == b) return maxx;
else return max(min(a, b), maxx);
}
void dfs(int x, int father, int w) {
d[x] = d[father] + 1;
f[x][0] = father; g[x][0] = w; h[x][0] = LONG_LONG_MIN;
for (int i = 1; i <= 20; i++) {
f[x][i] = f[f[x][i - 1]][i - 1];
g[x][i] = max (g[x][i - 1], g[f[x][i - 1]][i - 1]);
h[x][i] = ask (g[x][i - 1], g[f[x][i - 1]][i - 1], h[x][i - 1], h[f[x][i - 1]][i - 1]);
}
for (auto i : G[x]) {
if (!d[i.y]) dfs(i.y, x, i.v);
}
}
int lca(int x, int y) {
if(d[x] > d[y]) swap(x, y);
int tmp = d[y] - d[x];
for(int j = 0; tmp; ++j, tmp >>= 1)
if(tmp & 1) y = f[y][j];
if(x == y) return x;
for(int i = 20; i >= 0; i--)
if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
return f[x][0];
}
int ask2(int u, int v, int w) {
int ans = LONG_LONG_MIN;
for (int i = 20; i >= 0; i--) {
if (d[f[u][i]] >= d[v]) {
if (w != g[u][i]) ans = max (ans, g[u][i]);
else ans = max (ans, h[u][i]);
u = f[u][i];
}
}
return ans;
}
signed main()
{
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= m; i++) cin >> a[i].u >> a[i].v >>a[i].w;
kruskal();
dfs(1, 0, 0);
int ans = LONG_LONG_MAX;
for (int i = 1; i <= m; i++) {
if (vis[i]) continue;
int l = lca (a[i].u, a[i].v);
int max_u = ask2(a[i].u, l, a[i].w);
int max_v = ask2(a[i].v, l, a[i].w);
ans = min (ans, sum - max (max_u, max_v) + a[i].w);
}
cout << ans << '\n';
return 0;
}