Discription

有一棵以1为根的树,他有n个结点,用1到n编号。第i号点有一个值vi。

现在可以对树进行如下操作:

步骤1:在树中选一个连通块,这个连通块必须包含1这个结点。

步骤2:然后对这个连通块中所有结点的值加1或者减1。

问最少要经过几次操作才能把树中所有结点都变成0。

注意:步骤1与步骤2合在一起为一次操作。

Input

单组测试数据。 
第一行有一个整数n(1 ≤ n ≤ 10^5) 
接下来n-1行,每行给出 ai 和 bi (1 ≤ ai, bi ≤ n; ai ≠ bi),表示ai和bi之间有一条边,输入保证是一棵树。 
最后一行有n个以空格分开的整数,表示n个结点的值v1, v2, ..., vn (|vi| ≤ 10^9)。

Output

输出一个整数表示最少的操作步数。

Sample Input

3
1 2
1 3
1 -1 1

Sample Output

3

题解见注释(真的不知道我怎么想到差分约束的2333,网上全是用树上dp做的。。。)
/*考虑差分约束。1.设每个点i被add(i)次加操作涉及到,被dec(i)次减操作涉及到, 那么:add(i) - dec(i) + w[i] = 0.2.把dec用add表示后,每个点有两个限制:(1). add(i) >= max{0,-w[i]}(2). add(i) <= add(fa) + min{0,w[fa]-w[i]} 然后直接跑一个最短路,2*add(1) + w[1] 就是答案.
*/
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
using namespace std;
const int maxn=100005;
vector<int> g[maxn];
int ne[maxn*5],to[maxn*5],num;
int hd[maxn],val[maxn*5],n,m,w[maxn];
bool iq[maxn];
ll d[maxn];inline void add(int x,int y,int z){to[++num]=y,ne[num]=hd[x],hd[x]=num,val[num]=z;
}void dfs(int x,int fa){add(fa,x,min(0,w[fa]-w[x]));for(int i=g[x].size()-1,TO;i>=0;i--){TO=g[x][i];if(TO==fa) continue;dfs(TO,x);}
}inline void build(){for(int i=1;i<=n;i++) add(i,0,min(0,w[i]));dfs(1,1);
}inline void spfa(){queue<int> q;for(int i=0;i<=n;i++) q.push(i),iq[i]=1;int x;while(!q.empty()){x=q.front(),q.pop();for(int i=hd[x];i;i=ne[i]) if(d[x]+(ll)val[i]<d[to[i]]){d[to[i]]=d[x]+(ll)val[i];if(!iq[to[i]]) q.push(to[i]),iq[to[i]]=1;}iq[x]=0;}for(int i=1;i<=n;i++) d[i]-=d[0];
}int main(){scanf("%d",&n);int uu,vv;for(int i=1;i<n;i++){scanf("%d%d",&uu,&vv);g[uu].pb(vv),g[vv].pb(uu);}for(int i=1;i<=n;i++) scanf("%d",w+i);build();spfa();printf("%lld\n",d[1]*2+(ll)w[1]);return 0;
}

  

 

转载于:https://www.cnblogs.com/JYYHH/p/8807625.html

51NOD 1424 零树相关推荐

  1. 1424 零树 (树形DP)

    1424 零树 题意 给出一棵树,每次可以选择一个包含节点 1 的连通块,将所有的节点的权值同时加 1 或减 1 ,问最少多少次操作使所有节点权值变为 0 . 分析 这种题意简单的题目好处就是能很快知 ...

  2. 斜率小于0的连线数量 51Nod - 1107 (树状数组+离散化)

    二维平面上N个点之间共有C(n,2)条连线.求这C(n,2)条线中斜率小于0的线的数量. 二维平面上的一个点,根据对应的X Y坐标可以表示为(X,Y).例如:(2,3) (3,4) (1,5) (4, ...

  3. 51nod 1737 思维+ 树重心

    链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1737 思路: 对于每一条边,我们如果想要使得他发挥最大价值,其实 ...

  4. 51Nod 1322 - 关于树的函数(树DP)

    [题目描述] [思路] 看了大佬的题解才想明白的,f_zyj大佬的题解 两棵树,对第一棵树暴力枚举所有边,拆掉这条边后的两个子树对应两个集合 A1,B1A1,B1A1,B1,用 dfsdfsdfs 枚 ...

  5. 51Nod - 1588 幸运树(DFS)

    题目链接:51nod1588幸运树 思路 可以发现先看一个点,找出这个点走非幸运的边最多能走到s个点(最少为1),这个点的贡献答案就是(n-s)*(n-s-1),也就是从(n-s)个点中选择两个点,还 ...

  6. 51nod 平均数(二分+树状数组)

    题目链接: 平均数 基准时间限制:4 秒 空间限制:131072 KB 分值: 80 LYK有一个长度为n的序列a. 他最近在研究平均数. 他甚至想知道所有区间的平均数,但是区间数目实在太多了. 为了 ...

  7. 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习

    LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...

  8. 二进制搜索树_二进制搜索树数据结构举例说明

    二进制搜索树 A tree is a data structure composed of nodes that has the following characteristics: 树是由具有以下特 ...

  9. 基于MATLAB的数字图像K-L变换,基于DCT变换的图像编码方法研究

    分类号 密级 UDC注l 学 位 论 文 基于DCT变换的图像编码方法研究 (题名和副题名) 朱剑英 (作者姓名 指导教师姓名 副教授 中诱学位级别硕士 沦_义提交日期2004.1 专.业名称 通信与 ...

最新文章

  1. 数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)
  2. Git与Svn的区别—笔记1
  3. ECCV 2020 五项大奖出炉!李飞飞高徒、徒孙共摘最佳论文奖
  4. 收集Oracle常用命令----索引及约束
  5. 在Android Studio上进行OpenCV 3.1开发
  6. sdut 2128 树结构练习——排序二叉树(BST)的中序遍历
  7. 迭代器模式coding
  8. 神经网络- receptive field
  9. rmi远程代码执行漏洞_微软 Windows DNS Server 远程代码执行漏洞
  10. append从一个添加到另一_小米的另一妙用,制作小米锅巴,吃着嘎嘣脆,一口一个香得很...
  11. 蓝桥杯 基础练习 字符串对比
  12. 基于Posfix的邮件服务器维护总结
  13. android socket第三方库,OkSocket 一个Android轻量级Socket通讯框架
  14. ENSP简单建立直连路由线路
  15. 消费品牌数字营销“终局九问” | 2022全球数字价值峰会
  16. 一次失败的Thoughtworks面试经历
  17. Windows11关机键在哪 Win11系统关机键的位置
  18. 洛谷P4325 [COCI2006-2007#1] Modulo
  19. 基于QT的游戏修改器
  20. 用python画篮球场_如何使用 Python 创建一个 NBA 得分图

热门文章

  1. 使用C# lock同时访问共享数据
  2. WinCE5.0如何安装.NET3.5
  3. Bootstrap 3 Typeahead
  4. 补:小玩文件1-统计文本文件里的字符个数
  5. 科技领袖技术大亨们被指是现代强盗:不仅赚钱还想垄断
  6. [ASP.NET 控件实作 Day14] 继承 CompositeControl 实作 Toolbar 控件
  7. Oracel中连接的总结(一)
  8. rake -T 列出所有RAKE 命令.
  9. Android onSaveInstanceState、onRestoreInstanceState保存数据
  10. android Map集合的遍历