DFS+LCA样例通过提交全部RE求调
查看原帖
DFS+LCA样例通过提交全部RE求调
765847
lovely_codingcow楼主2024/4/1 10:20

RT,Segmentation Fault

#include <iostream>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>

#define int long long
#define endl '\n'

using namespace std;

int n, u, v, w, ans, root, rot, dep[200009], dp[200009], f[30][200009];
vector<pair<int, int>> g[200009];

void dfs(int u, int fa) {
	dp[u] = dp[fa] + 1;;
	f[u][0] = fa;
	for (auto [v, w]: g[u]) {
		if (v != fa) {
			dep[v] = dep[u] + w;
			dfs(v, u);
			if (dep[v] > ans) {
				ans = dep[v];
				root = v;
			}
		}
	}
}

int lca(int u, int v) {
	if (dp[u] < dp[v]) {
		swap(u, v);
	}
	while (dp[u] != dp[v]) {
		u = f[u][(int) log2(dp[u] - dp[v])];
	}
	for (int i = log2(n); i >= 0; i--) {
		if (f[u][i] != f[v][i]) {
			u = f[u][i];
			v = f[v][i];
		}
	}
	if (u != v) {
		u = f[u][0];
		v = f[v][0];
	}
	return u;
}

signed main() {
	cin >> n;
	for (int i = 1; i < n; i++) {
		cin >> u >> v >> w;
		g[u].push_back({v, w});
		g[v].push_back({u, w});
	}
	dfs(1, 0);
	memset(dep, 0, sizeof dep);
	memset(dp, 0, sizeof dp);
	rot = root;
	ans = 0;
	dfs(root, 0);
	cout << ans << endl;
	for (int i = 1; i <= log2(n); i++) {
		for (int j = 1; j <= n; j++) {
			f[j][i] = f[f[j][i - 1]][i - 1];
		}
	}
	int lca_ = 0;
	for (int i = 1; i <= n; i++) {
		if (dep[i] == ans) {
			if (lca_ == 0) {
				lca_ = i;
			} else {
				lca_ = lca(lca_, i);
			}
		}
	}
	cout << dp[lca_] - 1;
}
2024/4/1 10:20
加载中...