首页 > 其他 > 详细

[codeforces 1238F] The Maximum Subtree 树DP

时间:2019-11-02 20:25:35      阅读:94      评论:0      收藏:0      [点我收藏+]

题意

给定一颗树,求这个树的最大子树,且这个子树是一个good-tree。

good-tree的定义是:每个节点可以表示成一个数值区间,而树上的边表示两个点表示的数值区间相交。

题解

通过分析可以发现,这个子树是这个树的一条链,然后允许这条链上的点带上直接连接的点。

然后就转化为树上求最长链的DP问题。

技术分享图片
// #pragma GCC optimize(2)
// #pragma GCC optimize(3)
// #pragma GCC optimize(4)
#include <bits/stdc++.h>
//#include <unordered_set>
//#include <unordered_map>
// #include<bits/extc++.h>
// using namespace __gnu_pbds;
using namespace std;
#define pb push_back
#define fi first
#define se second
#define debug(x) cerr<<#x << " := " << x << endl;
#define bug cerr<<"-----------------------"<<endl;
#define FOR(a, b, c) for(int a = b; a <= c; ++ a)

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+7;


template<typename T>
inline T read(T&x){
    x=0;int f=0;char ch=getchar();
    while (ch<0||ch>9) f|=(ch==-),ch=getchar();
    while (ch>=0&&ch<=9) x=x*10+ch-0,ch=getchar();
    return x=f?-x:x;
}

/**********showtime************/
            const int maxn = 3e5+9;
            vector<int>mp[maxn];
            int dp[maxn];
            int ans = 0;

            void dfs(int u, int fa) {
                int sz = mp[u].size();
                dp[u] = sz;
                for(int v : mp[u]) {
                    if(v == fa) continue;
                    dfs(v, u);
                    ans = max(ans, dp[u] + dp[v]);
                    dp[u] = max(dp[u], dp[v] + sz - 1);
                }
            }
int main(){
            int T;  scanf("%d", &T);
            while(T--) {
                int n;  scanf("%d", &n);
                for(int i=1; i<=n; i++) mp[i].clear();
                for(int i=1; i<n; i++) {
                    int u, v;
                    scanf("%d%d", &u, &v);
                    mp[u].pb(v);
                    mp[v].pb(u);
                }
                ans = 0;
                dfs(1,  1);
                printf("%d\n", ans);
            }
            return 0;
}
View Code

 

[codeforces 1238F] The Maximum Subtree 树DP

原文:https://www.cnblogs.com/ckxkexing/p/11783743.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!