刷题题解:【牛客网】树学(树形dp)

题目描述:

在这里插入图片描述在这里插入图片描述

解题思路:

AC代码:

#include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e6+100;
    typedef long long LL;
    struct edge{
    int v;
    int next;
    }e[2*maxn];
    int cnt=0,head[2*maxn],vis[maxn];
    LL  sz[maxn],depsum[maxn],dp[maxn];
    void Insert(int u,int v){
    cnt++;
    e[cnt].v=v;
    e[cnt].next=head[u];
    head[u]=cnt;
    }
    void dfs(int u){
    vis[u]=1;
    sz[u]=1;
    for(int i=head[u];i>=0;i=e[i].next){
    int v=e[i].v;
    if(!vis[v]){
    dfs(v);
    sz[u]+=sz[v];
    depsum[u]+=depsum[v]+sz[v];
    }
    }
    }
    LL ans,n;
    void getans(int u){
    vis[u]=1;
    for(int i=head[u];i>=0;i=e[i].next){
    int v=e[i].v;
    if(!vis[v]){
    dp[v]=dp[u]+n-2*sz[v];
    ans=min(ans,dp[v]);
    getans(v);
    }
    }
    }
    int main(){
    memset(vis,0,sizeof(vis));
    memset(head,-1,sizeof(head));
    cin>>n;
    for(int i=1;i<=n-1;i++){
    int x,y;
    cin>>x>>y;
    Insert(x,y);
    Insert(y,x);
    }
    dfs(1);
    ans=depsum[1];
    dp[1]=depsum[1];
    memset(vis,0,sizeof(vis));
    getans(1);
    cout<<ans;
    return 0;
    }



上一篇博客:[leetcode] LCP 09. 最小跳跃次数(搜索、bfs)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值