CF2050G Tree Destruction 题解
lucasincyber · · 题解
题目传送门
思路
设
如果删掉的路径不包含
如果删掉的路径中
其中
如果删掉的路径中
因为需要用到
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int t, n;
int dp[N][3];
vector<int> tr[N];
void dfs(int u, int fa)
{
int cnt = 0;
for (int v : tr[u])
if (v != fa) cnt++;
dp[u][0] = 0, dp[u][1] = dp[u][2] = cnt;
for (int v : tr[u])
{
if (v == fa) continue;
dfs(v, u);
dp[u][0] = max({dp[u][0], dp[v][0], max(dp[v][1], dp[v][2]) + 1});
dp[u][2] = max(dp[u][2], dp[u][1] + dp[v][1] - 1);
dp[u][1] = max(dp[u][1], dp[v][1] + cnt - 1);
}
}
void solve()
{
scanf("%d", &n);
for (int i = 1, u, v; i < n; i++)
{
scanf("%d%d", &u, &v);
tr[u].push_back(v);
tr[v].push_back(u);
}
dfs(1, 0);
printf("%d\n", max({dp[1][0], dp[1][1], dp[1][2]}));
for (int i = 1; i <= n; i++)
tr[i].clear();
}
int main()
{
scanf("%d", &t);
while (t--) solve();
return 0;
}