0pts求条
查看原帖
0pts求条
1437964
future_chenxinzhi楼主2025/7/26 22:17

0pts求条 本蒟蒻条了n个下午

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100007;
const int MAXM = 300007;
struct edge {
	int nxt, to, val;
} e[MAXN << 1];
int h[MAXN], cnt;
void add(int u, int v, int w) {
	e[++cnt].nxt = h[u];
	e[cnt].to = v;
	e[cnt].val = w;
	h[u] = cnt;
}
struct edge1 {
	int u, v, w;
	bool used;
} e1[MAXN];
bool cmp(edge1 a, edge1 b) {
	return a.w < b.w;
}
int n, m, fa[MAXN];
long long ans0;
int find(int x) {
	if (fa[x] != x) return fa[x] = find(fa[x]);
	return x;
}
void kruskal() {
	sort(e1 + 1, e1 + m + 1, cmp);
	for (int i = 1; i <= m; ++i) {
		int u = find(e1[i].u), v = find(e1[i].v);
		if (u == v) continue;
		ans0 += e1[i].w;
		add(e1[i].u, e1[i].v, e1[i].w);
		add(e1[i].v, e1[i].u, e1[i].w);
		e1[i].used = 1;
		fa[v] = u;
	}
}
int f[MAXN][20] = {0}, mx[MAXN][20] = {0}, mx2[MAXN][20] = {0}, dep[MAXN];
int dfs(int u) {
	dep[u] = dep[f[u][0]] + 1;
	for (int i = 1; i <= 18; ++i) {
		f[u][i] = f[f[u][i - 1]][i - 1];
		if (mx[u][i - 1] == mx[f[u][i - 1]][i - 1]) {
			mx[u][i] = mx[u][i - 1];
			mx2[u][i] = max(mx2[f[u][i - 1]][i - 1], mx2[u][i - 1]);
		}
		if (mx[u][i - 1] > mx[f[u][i - 1]][i - 1]) {
			mx[u][i] = mx[u][i - 1];
			mx2[u][i] = max(mx[f[u][i - 1]][i - 1], mx2[u][i - 1]);
		}
		if (mx[u][i - 1] < mx[f[u][i - 1]][i - 1]) {
			mx[u][i] = mx[f[u][i - 1]][i - 1];
			mx2[u][i] = max(mx[f[u][i - 1]][i - 1], mx2[u][i - 1]);
		}
	}
	for (int i = h[u]; i; i = e[i].nxt) {
		int v = e[i].to, w = e[i].val;
		if (v == f[u][0]) continue;
		f[v][0] = u;
		mx[v][0] = w;
		dfs(v);
	}
}
int lca(int u, int v) {
	if (dep[u] < dep[v]) swap(u, v);
	for (int i = 18; i >= 0; --i)
		if (dep[u] - dep[v] >= (1 << i))
			u = f[u][i];
	if (u == v) return u;
	for (int i = 8; i >= 0; --i)
		if (f[u][i] != f[v][i]) {
			u = f[u][i];
			v = f[v][i];
		}
	return f[u][0];
}
long long lca2(int u, int v, int w) {
	int l = lca(u, v);
	int nmx = 0, nmx2 = 0;
	for (int i = 18; i >= 0; --i) {
		if (dep[f[u][i]] >= dep[l]) {
			if (nmx == mx[u][i]) nmx2 = max(mx2[u][i], nmx2);
			if (nmx > mx[u][i]) nmx2 = max(mx[u][i], nmx2);
			if (nmx < mx[u][i]) {
				nmx2 = max(mx2[u][i], nmx);
				nmx = mx[u][i];
			}
			u = f[u][i];
		}
		if (dep[f[v][i]] >= dep[l]) {
			if (nmx == mx[v][i]) nmx2 = max(mx2[v][i], nmx2);
			if (nmx > mx[v][i]) nmx2 = max(mx[v][i], nmx2);
			if (nmx < mx[v][i]) {
				nmx2 = max(mx2[v][i], nmx);
				nmx = mx[v][i];
			}
			v = f[v][i];
		}
	}
	if (w != nmx) return ans0 - nmx + w;
	if (nmx2) return ans0 - nmx2 + w;
	return 0x7f7f7f7f7f7f7f7f;
}
int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= m; ++i) {
		cnt++;
		scanf("%d%d%d", &e1[cnt].u, &e1[cnt].v, &e1[cnt].w);
		if (e1[i].v == e1[i].u) cnt--;
	}
	for (int i = 1; i <= n; ++i) fa[i] = i;
	kruskal();
	dfs(1);
	long long ans = 0x7f7f7f7f7f7f7f7f;
	for (int i = 1; i <= m; ++i)
		if (!e1[i].used)
			ans = min(ans, lca2(e1[i].u, e1[i].v, e1[i].w));
	printf("%d", ans);
	return 0;
}
2025/7/26 22:17
加载中...