题解:AT_abc394_f [ABC394F] Alkane
定义
对每个非根节点
转移
若
若
枚举每个顶点
若
取所有情况的最大值。
#include <bits/stdc++.h>
// #include <atcoder/all>
// #define int long long
using namespace std;
inline int read()
{
int f = 0, ans = 0;
char c = getchar();
while (!isdigit(c))
f |= c == '-', c = getchar();
while (isdigit(c))
ans = (ans << 3) + (ans << 1) + c - 48, c = getchar();
return f ? -ans : ans;
}
void write(int x)
{
if (x < 0)
putchar('-'), x = -x;
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
constexpr int N = 2e5 + 5;
int n, ans, f[N];
vector<int> g[N];
vector<pair<int, int>> sub_f[N];
void dfs(int u, int fa)
{
f[u] = 1;
for (int &v : g[u])
if (v != fa)
{
dfs(v, u);
sub_f[u].emplace_back(v, f[v]);
}
sort(begin(sub_f[u]), end(sub_f[u]), [](auto &x, auto &y)
{ return x.second > y.second; });
if (size(sub_f[u]) >= 3)
{
f[u] += f[sub_f[u][0].first] + f[sub_f[u][1].first] + f[sub_f[u][2].first];
if (fa)
ans = max(ans, f[u] + 1);
}
if (size(sub_f[u]) >= 4)
{
ans = max(ans, 1 + f[sub_f[u][0].first] + f[sub_f[u][1].first] + f[sub_f[u][2].first] + f[sub_f[u][3].first]);
}
}
void resolve(int u, int fa, int from_fa)
{
if (fa && f[u] != 1)
ans = max(ans, f[u] + from_fa);
if (fa)
sub_f[u].emplace_back(0, from_fa);
sort(begin(sub_f[u]), end(sub_f[u]), [](auto &x, auto &y)
{ return x.second > y.second; });
for (int &v : g[u])
if (v != fa)
{
int sum = 0, cnt = 0;
for (auto &[i, w] : sub_f[u])
if (i != v)
{
sum += max(f[i], w);
if (++cnt == 3)
break;
}
if (cnt == 3)
resolve(v, u, sum + 1);
}
}
signed main()
{
// freopen("in.in", "r", stdin);
// freopen(".out", "w", stdout);
cin >> n;
for (int i = 1; i < n; ++i)
{
int u, v;
cin >> u >> v;
g[u].emplace_back(v);
g[v].emplace_back(u);
}
ans = -1;
dfs(1, 0);
resolve(1, 0, 0);
write(ans);
return 0;
}