51NOD 1424 零树

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nosql的数据服务_使用NoSQL实现实体服务–第1部分:概述

nosql的数据服务在过去的几周中&#xff0c;我一直在进行一些研发工作&#xff0c;以了解使用NoSQL数据库实现实体服务 &#xff08;也称为数据服务&#xff09;的优势。 实体服务是Thomas Erl的《服务技术》丛书中提出的服务分类。 它用于描述高度不可知和可重复使用的服务&am…

Java中获取当前函数名

Java中获取当前函数名 博客分类&#xff1a; Java JavathreadJDKIDEA 有时候我们需要在程序中获取当前运行的函数名&#xff0c;如何简单的做到这点呢&#xff1f;我们可以用getStackTrace轻松搞定。 一提到getStatckTrace多数人会联想到Thowable中的getStackTrace方法。的确&…

day19 复习,组合和继承

组合&#xff1a;当一个类的对象作为另一个类对象的属性就叫组合 表示的一种什么有什么的关系 面向对象的思想 不关心程序的执行过程 关心的事一个程序中的角色以及角色与角色的关系 python中一切皆对象 实例化的过程 创建一个对象 __init__给对象添加属性&#xff0c;对…

Spring Boot和数据库初始化

Spring Boot是一个很好的框架&#xff0c;可在开发Spring应用程序时为开发人员节省大量时间和精力。 它的主要功能之一是数据库初始化。 您可以使用spring boot来初始化您的sql数据库。 我们将从gradle文件开始 group com.gkatzioura version 1.0-SNAPSHOTapply plugin: java…

学习Java: Queue

15 08, 2007 学习Java: Queue Java — 作者 zybing 15:17Java提供了Quere&#xff0c;相当好用&#xff0c;在1.5版本中又有增强。Queue&#xff1a; 基本上&#xff0c;一个队列就是一个先入先出&#xff08;FIFO&#xff09;的数据结构 offer&#xff0c;add区别&#xff1…

建站手册-网站主机:电子商务主机

ylbtech-建站手册-网站主机&#xff1a;电子商务主机1.返回顶部 1、http://www.w3school.com.cn/hosting/host_ecommerce.asp2、2.返回顶部1、如果您的公司正在销售某种产品或服务&#xff0c;那么电子商务也许是做生意的一种好办法。 Internet 商业 电子商务就是在 Internet 上…

ConcurrentLinkedQueue

ConcurrentLinkedQueue 因为ConcurrentLinkedQueue是线程序安全的并且是针对并发的 主类 Java代码 public class conn{ public static void main(String[] args) throws Exception{ Queue<String> queuenew ConcurrentLinkedQueue<String>(); …

【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器

每天学习一点点 编程PDF电子书、视频教程免费下载&#xff1a;http://www.shitanlife.com/code一、反向代理&#xff1a;Web服务器的“经纪人” 1.1 反向代理初印象 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;…

剖析java中的String之__拼接

剖析java中的String之__拼接 分类&#xff1a; java 2011-08-24 17:46 31人阅读 评论(0) 收藏 举报 出处, http://blog.csdn.net/izard999/article/details/6708433 网上剖析String的不少&#xff0c;关于其他的String的知识我就不累赘去说了&#xff01; 本文只解释下我在面…

mfc 弹簧_整合弹簧,速度和瓷砖

mfc 弹簧我喜欢 Tiles&#xff0c; 并且听到了很多有关 Velocity的信息 。 它们似乎有不同的用途&#xff0c;并且据说很容易结合在一起&#xff0c;所以我决定试一试&#xff0c;并在Spring Web应用程序中同时使用它们。 集成实际上花费了许多小时&#xff0c;并且是一次真正的…

STM32-RS485通信软硬件实现

OS&#xff1a;Windows 64 Development kit&#xff1a;MDK5.14 IDE&#xff1a;UV4 MCU&#xff1a;STM32F103C8T6/VET6 AD&#xff1a;Altium Designer 18.0.12 1、RS485简介  RS-485又名TIA-485-A, ANSI/TIA/EIA-485或TIA/EIA-485。RS485是一个定义平衡数字多点系统中的驱动…

MFC如何使控件大小随着对话框大小自动调整

MFC如何使控件大小随着对话框大小自动调整 2012-04-27 16:24:50| 分类&#xff1a; MFC | 标签&#xff1a; |字号大中小 订阅 对话框的大小变化后&#xff0c;假若对话框上的控件大小不变化&#xff0c;看起来会比较难看。下面就介绍怎么让对话框上的控件随着对话框的…

Spring MVC整合Ehcache缓存框架

https://blog.csdn.net/u012562943/article/details/52289433转载于:https://www.cnblogs.com/pjlhf/p/8818747.html

Java 枚举7常见种用法

DK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能&#xff0c;却给我的开发带来了“大”方便。 用法一&#xff1a;常量 在JDK1.5 之前&#xff0c;我们定义常量都是&#xff1a; publicstaticfianl....。现在好了&#xff0c;有了枚举&#xff0c;可以把相关的常…

Spring和Hibernate的自定义审核日志

如果您需要对所有数据库操作进行自动审核 &#xff0c;并且正在使用Hibernate…&#xff0c;则应使用Envers或spring data jpa auditing 。 但是&#xff0c;如果由于某些原因您不能使用Envers&#xff0c;则可以使用休眠事件侦听器和spring事务同步来实现类似的功能。 首先&a…

深度学习训练数据打标签过程

深度学习训练数据打标签过程 为了获取大量的图片训练数据&#xff0c;在采集数据的过程中常用视频的方式采集数据&#xff0c;但对于深度学习&#xff0c;训练的过程需要很多的有有标签的数据&#xff0c;这篇文章主要是解决视频文件转换成图片文件&#xff0c;并加标签&#x…

java 枚举学习--从小程序中学习

java 枚举学习--从小程序中学习 Java 枚举类型 解析 简介&#xff1a;java中枚举是一个类 用之前我觉得还是要知道应该何时使用&#xff1a; 一条普遍的规律是&#xff0c;任何使用常量的地方&#xff0c;例如目前使用的switch 代码切换的地方。 如果只是单独一个值&am…

《修改代码的艺术》读书笔记一

一、修改软件的起因及其本质。 修改软件是任何一个开发人员所面对的问题&#xff0c;软件是否容易修改&#xff0c;被修改后的软件是否变得更好&#xff0c;是每一个开发人员都知道必须关注但是在实际开发过程中却往往忽视的问题。有多少人在接手一个新项目时抱怨新项目的遗留代…

Java基础笔记 – 枚举类型的使用介绍和静态导入

Java基础笔记 – 枚举类型的使用介绍和静态导入 本文由 arthinking 发表于404 天前 ⁄ Java基础 ⁄ 暂无评论 ⁄ 被围观 1,433 views 1、枚举&#xff08;Enum&#xff09;&#xff1a;JDK5.0中加入了枚举类型&#xff0c;使用enum关键字定义&#xff0c;可以按照如下定义&am…

spring自动装配依赖包_解决Spring自动装配中的循环依赖

spring自动装配依赖包我认为这篇文章是在企业应用程序开发中使用Spring的最佳实践。 使用Spring编写企业Web应用程序时&#xff0c;服务层中的服务量可能会增加。 服务层中的每个服务可能会消耗其他服务&#xff0c;这些服务将通过Autowire注入。 问题&#xff1a;当服务数量…