发现数组开反了,改完 WA 0pts。
```cpp
#include <iostream>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <bitset>
#define int long long
#define endl '\n'
#define inf 9223372036854775807
using namespace std;
int n, u, v, w, ans, root, rot, dep[200009], dp[200009], f[200009][40];
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];
}
}
bool p = false;
int lca_ = 0;
for (int i = 1; i <= n; i++) {
if (dep[i] == ans) {
if (lca_ == 0) {
lca_ = i;
} else {
p = true;
lca_ = lca(lca_, i);
}
}
}
cout << (p ? dp[lca_] - 1 : 0);
}
```
by lovely_codingcow @ 2024-04-01 10:57:05