80pts 求调
查看原帖
80pts 求调
519797
mengxin_oier楼主2024/7/23 15:00

看讨论区很多 80 pts 的,咋都不分享一下挂分原因呢?

80分求调。

#include <bits/stdc++.h>

using namespace std;

const int N = 5010, M = 10010;

struct edge {
	int to, next, w;
} e[M];

int head[N], idx = 1;
bool del[M];

void add(int u, int v, int w) {
	idx++, e[idx].to = v, e[idx].w = w, e[idx].next = head[u], head[u] = idx;
}

int n;
int f[N][2];
int maxx;

void dfs(int u, int fa) {
	for (int i = head[u]; i; i = e[i].next) {
		int to = e[i].to;
		if (del[i]) continue;
		if (to == fa) continue;
		dfs(to, u);
		if (f[u][0] < f[to][0] + e[i].w) {
			f[u][1] = f[u][0];
			f[u][0] = f[to][0] + e[i].w;
		}
		else if (f[u][1] < f[to][0] + e[i].w) {
			f[u][1] = f[to][0] + e[i].w;
		}
	}
	maxx = max(maxx, f[u][0] + f[u][1]);
}

int solve(int u) {
	memset(f, 0, sizeof(f));
	maxx = 0;
	dfs(u, 0);
	return maxx;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	cin >> n;
	for (int i = 1; i < n; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		add(u, v, w), add(v, u, w);
	}
	
	int ans = 0x3f3f3f3f;
	
	for (int i = 2; i <= idx; i += 2) {
		del[i] = del[i ^ 1] = true;
		int x1 = solve(e[i].to);
		int x2 = solve(e[i ^ 1].to);
		ans = min(ans, max(max(x1, x2), (x1 + 1) / 2 + (x2 + 1) / 2 + e[i].w));
		del[i] = del[i ^ 1] = false;
	}
	cout << ans << '\n';
	return 0;
}

2024/7/23 15:00
加载中...