计蒜客 ICPC NEAU Programming Contest 2020 G.选根 (树形dp)

链接选根

题意:
定义根的深度为 1, 节点 i 的价值为 depth[i]*val[i], 求以 1 -n 为根时 整棵树的价值。

思路
这种题目一般都是分成子树内和子树外分别求值的。

  1. 首先来求子树内的权值, dp[u] 表示 以 u 为根的子树内的权值 ,vv[u]表示以 u 的子树内所有点的 val 之和。那么转移方程就是 dp[u]+=dp[to]+vv[to]; vv[u]+=vv[to];
    因为向父节点转移的时候相当于 每个节点的深度都 +1 了 所以要加上 vv[to];
  2. 然后就是 子树外的权值,子树外的权值可以用父节点的答案减去 当前节点对父节点的贡献,再加上子树外的节点深度+1 产生的贡献,再加上该节点为根 子树内的贡献就好了。
pv[u]=vv[pre]+pv[pre]-vv[u];   // pv 表示子树外 点的 val值之和
ans[u]=ans[pre]-dp[u]-vv[u] +pv[u] +dp[u];  dp[u]可抵消,这样写便于理解

代码

#include<iostream>
#include<cstdio>
#include<set>
#include<math.h>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=4e5+7;
int n,m,head[maxn],num=0;
ll dp[maxn],pre[maxn],ans[maxn],val[maxn],vv[maxn],pv[maxn],av[maxn];
struct node{
    ll next,to;
}e[maxn];
void add(int u,int v){
     e[num].next=head[u];
     e[num].to=v;
     head[u]=num++;
}
void dfs1(int u, int pre){
    dp[u]=val[u];vv[u]=val[u];
    for(int i=head[u];i!=-1;i=e[i].next){
        int to=e[i].to;
        if(to== pre)  continue;
        dfs1(to,u);
        dp[u]+=dp[to]+vv[to];
        vv[u]+=vv[to];
    }
}
void dfs2(int u, int pre){
    if(u==1) pv[u]=0,ans[u]=dp[u];
    else {
        pv[u]=vv[pre]+pv[pre]-vv[u];
        ans[u]=ans[pre]-dp[u]-vv[u] +pv[u] +dp[u];
    }
    for(int i=head[u];i!=-1;i=e[i].next){
        int to=e[i].to;
        if(to== pre)  continue;
        dfs2(to,u);
    }
}
int main (){
   int t;
   cin>>t;
   while(t--){
        int n;cin>>n;
        for(int i=0;i<=n;i++) head[i]=-1;num=0;
        for(int i=1;i<=n;i++) scanf("%lld",&val[i]);
        for(int i=0,u,v;i<n-1;i++){
            scanf("%d%d",&u,&v);
            add(u,v);
            add(v,u);
        }
        dfs1(1,-1);dfs2(1,-1);
        for(int i=1;i<=n;i++){
            printf ("%lld ",ans[i]);
        }
        printf ("\n");
   }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于协同过滤、矩阵分解、gvdt+lr、wide&deep等算法的推荐模型python实现源码含项目说明+数据集.zip 推荐算法的实现,python、jupyter双版本,详尽注释。 正在努力更新中... #### 对MovieLens电影评分小型数据集做Top N推荐: 0. baseline--推荐最热门的N=20部电影,precision=11%, recall=4%, coverage=0.2%, popularity=169。这部分内容包含在UserCF.py 1. UserCF,precision=25%, recall=10%, coverage=10%, popularity=4.4 2. ItemCF,precision=26%, recall=10%, coverage=15%, popularity=4.3 #### 对MovieLens电影评分小型数据集做评分预测: 0. baseline--使用所有评分的均值做预测,MAE:0.83。这部分内容包含在LinearRegression_Rating.ipynb 1. BiasSVD,MAE:0.68 2. LinearRegression,MAE:0.61 #### 对criteo广告展示小型数据集做点击率预测 1. gbdt+lr,binary_logloss:0.4783 #### 对Census数据中的收入做二分类 0. Google TensorFlow Guide上的Wide&Deep基准模型准确率: 0.83。(从有的知乎博主分享的链接来看,已经打不开了) 1. Wide&Deep, accuracy: 0.8587
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于C++实现的连接池、线程池、内存池、对象池项目源码含项目说明.zip ## CPP连接池 ### 关键技术点 MySQL数据库编程、单例模式、queue队列容器、C++11多线程编程、线程互斥、线程同步通信和 unique_lock、基于CAS的原子整形、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型 ## CPP线程池 ### 关键技术点 作为五大池之一(内存池、连接池、线程池、进程池、协程池),线程池的应用非常广泛,不管是客户 端程序,还是后台服务程序,都是提高业务处理能力的必备模块。有很多开源的线程池实现,虽然各自 接口使用上稍有区别,但是其核心实现原理都是基本相同的。 ## CPP内存池 ### 关键技术点 读一下STL和nginx的内存池实现,并且单单的内存池的地方项目提取出来,方便后面对于不同类型的内存池进行分析 ## 对象池 ### 关键技术点 对于new和delete,malloc和free的源码进行阅读,对于创建对象需要多次创建和释放的的情况实现一个对象池 实现的方案使用Queue进行创建

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值