不错的树形dp。一个结点能走多次,树形的最大特点是到达后继的路径是唯一的,那个如果一个结点无法往子结点走,那么子结点就不用考虑了。

有的结点不能走完它的子结点,而有的可能走完他的子节点以后还会剩下一些点数。

影响走的次数的是当前结点的点数,因为往子结点走是一定要回来的,进入这个结点要花费这个结点一个点数,

剩下的点数k[i]-1就是往子结点走的最大次数,但是有可能会有剩余的点数。

可以这样处理,定义一个dp[i]表示花费一个点数进入i结点以后从它及其后代得到的最大价值,

根据这个定义,能走到的结点i的dp[i]至少为1,而且花费为1,如果有剩下的点数,对于i的父节点,想要得到剩下的点数,至少花费一个1点数才能得到1个点数。

不会比dp[i]更优,所以优先考虑选择dp[i],对于同样的dp值优先选大的。

转移方程为dp[i] = {dp[j]}+cnt*2,|{dp[j]}|==min(k[i]-1,|{j}|),cnt = min(k[u]-1-|{j}|,sum(left(j)))。

|{j}|表示后代数量,cnt是子节点后剩下的点数和后代结点剩下的点数的最小值。

当k[i]-1>|{j}|时可以选完后代的dp值,然后就要考虑选剩下的点数后代剩下的点数left(j),

转移的时候还要维护一下left(i)。不能走到的点就不考虑了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+;
typedef long long ll; int k[maxn];
ll d[maxn]; vector<int> G[maxn];
#define PB push_back bool cmp(int a,int b) { return a > b; }
ll dp(int u,int fa)
{
if(d[u]>) return d[u];
k[u]--;
if(!G[u].size()|| !k[u]) {
return d[u] = ;
}
vector<ll> opt;
int cnt = ;
for(int i = ; i < (int)G[u].size(); i++){
int v = G[u][i];
if(v == fa || !k[v]) continue;
opt.PB(dp(v,u));
cnt += k[v];
}
if(!opt.size()) return d[u] = ;
int m = min(k[u],(int)opt.size());
nth_element(opt.begin(),opt.begin()+m,opt.end(),cmp);
k[u] -= m;
d[u] = m;
for(int i = ; i < m; i++){
d[u] += opt[i];
}
if(k[u]>){
m = min(k[u],cnt);
k[u] -= m;
d[u] += m<<;
}
return ++d[u];
} int main()
{
//freopen("in.txt","r",stdin);
int n; scanf("%d",&n);
for(int i = ; i <= n; i++) scanf("%d",k+i);
for(int i = ; i < n; i++){
int u,v; scanf("%d%d",&u,&v);
G[u].PB(v); G[v].PB(u);
}
int s; scanf("%d",&s);
k[s]++;
printf("%I64d\n",dp(s,-)-);
return ;
}

CodeForces 77C Beavermuncher-0xFF (树形dp)的更多相关文章

  1. codeforces 212E IT Restaurants(树形dp+背包思想)

    题目链接:http://codeforces.com/problemset/problem/212/E 题目大意:给你一个无向树,现在用两种颜色去给这颗树上的节点染色.用(a,b)表示两种颜色分别染的 ...

  2. Codeforces 123E Maze(树形DP+期望)

    [题目链接] http://codeforces.com/problemset/problem/123/E [题目大意] 给出一棵,给出从每个点出发的概率和以每个点为终点的概率,求出每次按照dfs序从 ...

  3. codeforces 709E E. Centroids(树形dp)

    题目链接: E. Centroids time limit per test 4 seconds memory limit per test 512 megabytes input standard ...

  4. bzoj 4424: Cf19E Fairy && codeforces 19E. Fairy【树形dp】

    参考:https://blog.csdn.net/heheda_is_an_oier/article/details/51131641 这个找奇偶环的dp1真是巧妙,感觉像tarjan一样 首先分情况 ...

  5. Codeforces gym101955 A【树形dp】

    LINK 有n个大号和m个小号 然后需要对这些号进行匹配,一个大号最多匹配2个小号 匹配条件是大号和小号构成了前缀关系 字符串长度不超过10 问方案数 思路 因为要构成前缀关系 所以就考虑在trie树 ...

  6. Educational Codeforces Round 52F(树形DP,VECTOR)

    #include<bits/stdc++.h>using namespace std;int n,k;vector<int>son[1000007];int dp[100000 ...

  7. codeforces 696B B. Puzzles(树形dp+概率)

    题目链接: B. Puzzles time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  8. Codeforces 490F Treeland Tour 树形dp

    Treeland Tour 离散化之后, 每个节点维护上升链和下降链, 感觉复杂度有点高, 为啥跑这么快.. #include<bits/stdc++.h> #define LL long ...

  9. Codeforces Round #384 (Div. 2)D - Chloe and pleasant prizes 树形dp

    D - Chloe and pleasant prizes 链接 http://codeforces.com/contest/743/problem/D 题面 Generous sponsors of ...

随机推荐

  1. 怎么将vim的剪切版设置成系统的剪切版

    如果你用vim敲完了代码,怎么把代码提交到ACMoj的粘贴版上呢. 这是个问题. 去网上查了一下,首先有人说可以在vimrc里面添加 set clipboard=unnamed 我试了一下,没有效果. ...

  2. CSU - 1580 NCPC2014 Outing(树形依赖+分组背包)

    Outing Input Output Sample Input 4 4 1 2 3 4 Sample Output 4 分组背包: for 所有的组k for v=V..0 for 所有的i属于组k ...

  3. JS实现页面刷新方法

    下面介绍全页面刷新方法:有时候可能会用到 window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架) opener.loc ...

  4. java中对List进行分组和排序

    排序 对List进行排序,有两种办法 第一个是用java提供的工具类Collections提供的sort方法进行排序 废话不多说,上代码 首先定义一个Student public class Stud ...

  5. SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面

    一.Druid连接池 1.druid简介 Druid连接池是阿里巴巴开源的数据库连接池项目.Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能.功能强大,能防SQL注入,内置Login ...

  6. maven工程运行出Unable to compile class for JSP: 错误

    使用mvn tomcat:run运行时出现500错误,使用tomcat7再次运行就好了 更新,上面的是在命令行操作的 如果要在idea上面出现错误的话需要在pom.xml上配置下面的语句 org.ap ...

  7. 长春理工大学第十四届程序设计竞赛(重现赛)H.Arithmetic Sequence

    题意: 数竞选手小r最喜欢做的题型是数列大题,并且每一道都能得到满分. 你可能不相信,但其实他发现了一个结论:只要是数列,无论是给了通项还是给了递推式,无论定义多复杂,都可以被搞成等差数列.这样,只要 ...

  8. NET Core容器

    NET Core容器化之多容器应用部署@Docker-Compose   1.引言 紧接上篇.NET Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反 ...

  9. Linux下无图形界面安装Matlab

    1 下载R2015b_glnxa64.iso和破解文件Matlab+2015b+Linux64+Crack 百度网盘可以直接搜索资源.推荐一个可以多线程下载百度网盘超大文件的工具Aria2,均速1.3 ...

  10. 详解Java构造方法为什么不能覆盖,我的钻牛角尖病又犯了....

    一 看Think in Java,遇到个程序 class Egg2 { protected class Yolk { public Yolk() { System.out.println(" ...