ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STA树的深度(树型DP)

2020-04-13 18:01:09  阅读:301  来源: 互联网

标签:ch STA int 深度 树型 include 节点 DP size


STA树的深度

题目大意

给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大

Input

给出一个数字N,代表有N个点.N<=1000000 下面N-1条边.

Output

输出你所找到的点,如果具有多个解,请输出编号最小的那个.

Sample Input

8
1 4
5 6
4 5
6 7
6 8
2 4
3 4

Sample Output

7

Solution

两种思路
第一就是贪心爆搜
第二就是DP
显然这道题贪心不可做
那么来考虑动态规划
设根节点为i的答案是\(dp_i\)
当前节点u的规模为\(size_u\)
那么更新答案的时候每次向下寻找一个子节点
深度就\(-=size_v\)并且\(+=(n - size_v)\)
现在只需要预处理出第一个\(dp_1\)
即可对所有状态进行转移

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;

inline int read(){
    int x = 0, w = 1;
    char ch = getchar();
    for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;
    for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
    return x * w;
}

const int maxn = 55505;
struct node{
    int to, nxt, w;
}edge[maxn << 1];

int n;
int head[maxn], tot;
int ans[maxn];

inline void add(int x, int y){
    edge[++tot].to = y;
    edge[tot].nxt = head[x];
    // edge[tot].w = z;
    head[x] = tot;
}

int siz[maxn];
int dp[maxn];
int dep[maxn];
inline void dfs(int u,int fa){
    siz[u]=1;
    dp[u]=dep[u];
    for(int i=head[u];i;i=edge[i].nxt){
        int v=edge[i].to;
        if(v==fa)continue;
        dep[v]=dep[u]+1;
        dfs(v,u);
        siz[u]+=siz[v];
        dp[u]+=dp[v];
    }
}   

inline void calc(int u,int fa){
    for(int i=head[u];i;i=edge[i].nxt){
        int v=edge[i].to;
        if(v==fa)continue;
        dp[v]=dp[u]-siz[v]+n-siz[v];
        calc(v,u);
    }
}
signed main(){
    scanf("%d",&n);
    for(int i=1;i<n;i++){
        int a = read(), b = read();
        add(a,b);
        add(b,a);
    }
    dfs(1,0);
    calc(1,0);
    int ans=0;
    for(int i=1;i<=n;i++)
        if(dp[ans]<dp[i])ans=i;
    printf("%d\n",ans);
}

标签:ch,STA,int,深度,树型,include,节点,DP,size
来源: https://www.cnblogs.com/rui-4825/p/12692897.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有