Codeforces 1238F The Maximum Subtree dp

The Maximum Subtree

考虑good tree 长什么样子, 除了一点可以有2个儿子有儿子以外, 其余点最多只能有一个儿子有儿子。

然后直接dp就好啦。

#include
#define fi first
#define se second
#define mk make_pair
using namespace std;
 
const int N = (int)3e5 + 7;
 
int n;
int dp[N];
int ans;
 
vector<int> G[N];
 
void update(pair<int, int> &A, int B) {
    if(B > A.fi) A = mk(B, A.fi);
    else A = mk(A.fi, max(A.se, B));
}
 
void dfs(int u, int fa) {
    dp[u] = 1;
    pair<int, int> mx(-1, -1);
    int child = 0, gg = 0;
    for(auto &v : G[u]) {
        if(v == fa) continue;
        child++;
        dfs(v, u);
        update(mx, dp[v]);
    }
    dp[u] = max(dp[u], mx.fi + child);
    if(child >= 2) ans = max(ans, mx.fi + mx.se + child - 1 + (fa != 0));
    ans = max(ans, dp[u]);
}
 
void init() {
    for(int i = 1; i <= n; i++) {
        G[i].clear();
    }
}
int main() {
    int T; scanf("%d", &T);
    while(T--) {
        scanf("%d", &n);
        init();
        ans = 1;
        for(int i = 1; i < n; i++) {
            int u, v;
            scanf("%d%d", &u, &v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
        dfs(1, 0);
        printf("%d\n", ans);
    }
    return 0;
}

 

你可能感兴趣的:(Codeforces 1238F The Maximum Subtree dp)