分析

首先一些结论,每条边最多被翻一次,而且由翻的边所构成的连通块答案就是度数为奇数的点的个数的一半,

因为在连通块内必然选择两个叶子节点间的路径翻是最优的,所以也就是选择两个度数为奇数的点,所以结论很显然

设\(dp[i][0/1]\)表示第\(i\)个点与其父亲的边翻或不翻时,以第\(i\)个点为根的子树的最小代价(操作数\(x\)和路径长度\(y\))

设\(f[0/1]\)表示第\(i\)个点的儿子们是否影响第\(i\)个点的度数的最小代价(儿子们的答案之和)

那么\(f[0]=\min \{f[0]+dp[son][0],f[1]+dp[son][1]\},f[1]=\min\{f[0]+dp[son][1],f[1]+dp[son][0]\}\)

考虑用\(f[0],f[1]\)更新\(dp[i][0/1]\),那么\(dp[i][0]=\min\{(f[1].x+1,f[1].y),f[0]\},dp[i][1]=\min\{(f[1].x,f[1].y+1),(f[0].x+1,f[0].y+1)\}\)

最后输出\(dp[1][0]\)


代码

#include <cstdio>
#include <cctype>
#include <cstdlib>
#define rr register
using namespace std;
const int inf=1e9,N=100011;
struct rec{
int x,y;
rec operator +(const rec &t)const{
return (rec){x+t.x,y+t.y};
}
bool operator <(const rec &t)const{
return x<t.x||(x==t.x&&y<t.y);
}
}dp[N][2];
struct node{int y,w,next;}e[N<<1];
int as[N],k=1,n;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline rec Min(rec x,rec y){return x<y?x:y;}
inline void dfs(int x,int fa,int w){
rr rec f1=(rec){0,0},f2=(rec){inf,inf},F1,F2;
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fa){
dfs(e[i].y,x,e[i].w);
F1=Min(f1+dp[e[i].y][0],f2+dp[e[i].y][1]);
F2=Min(f1+dp[e[i].y][1],f2+dp[e[i].y][0]);
f1=F1,f2=F2;
}
if (w==1) dp[x][0]=(rec){inf,inf};
else dp[x][0]=Min(f1,(rec){f2.x+1,f2.y});
if (w==0) dp[x][1]=(rec){inf,inf};
else dp[x][1]=Min((rec){f1.x+1,f1.y+1},(rec){f2.x,f2.y+1});
}
signed main(){
n=iut();
for (rr int i=1;i<n;++i){
rr int x=iut(),y=iut();
rr int z1=iut(),z2=iut();
rr int z=z2==2?z2:(z1^z2);
e[++k]=(node){y,z,as[x]},as[x]=k;
e[++k]=(node){x,z,as[y]},as[y]=k;
}
dfs(1,0,0);
return !printf("%d %d",dp[1][0].x>>1,dp[1][0].y);
}

#树形dp#nssl 1469 W的更多相关文章

  1. [NOIP10.3模拟赛]3.w题解--神奇树形DP

    题目链接: 咕 闲扯: 这题考场上把子任务都敲满了,5个namespace,400行11k 结果爆0了哈哈,因为写了个假快读只能读入一位数,所以手测数据都过了,交上去全TLE了 把边分成三类:0. 需 ...

  2. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  3. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  4. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  5. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  6. HDU4003Find Metal Mineral[树形DP 分组背包]

    Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Other ...

  7. NOIP2011pj表达式的值[树形DP 笛卡尔树 | 栈 表达式解析]

    题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...

  8. 【BZOJ-3572】世界树 虚树 + 树形DP

    3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1084  Solved: 611[Submit][Status ...

  9. 【BZOJ-2286】消耗战 虚树 + 树形DP

    2286: [Sdoi2011消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2120  Solved: 752[Submit][Status] ...

  10. 【BZOJ-2435】道路修建 (树形DP?)DFS

    2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3115  Solved: 1002[Submit][Statu ...

随机推荐

  1. 本地配置静态ip和dns及虚拟机

  2. Sourcetree 如何关联自己的gitlab仓库

    现在有些企业自己搭建了gitlab服务器,通过sourcetree从企业服务器拉取代码的时候会提示认证失败.今天搞了大半天才搞懂,给我自己做个笔记. 添加账户 托管服务商 选择 GitLab CE 托 ...

  3. Python函数每日一讲 - 一文让你彻底掌握Python中的frozenset函数

    引言 在 Python 中,frozenset() 函数是一个重要的工具,用于创建不可变的集合对象.本文将介绍 frozenset() 函数的语法.用法示例以及实际应用场景,帮助大家更好地理解和应用这 ...

  4. ZYNQ核心板及其底板开源啦!

    Hello-FPGA ZYNQ 设计开源啦! 开源ZYNQ核心板 + 底板 硬件设计.软件设计,软件设计使用裸机演示,演示了如何使用AXI DMA等关键dma 模块 欢迎加QQ 讨论 94755958 ...

  5. C++ //vector 容器构造 vector赋值操作 vector 容量大小 vector插入和删除 //vector数据存取 vector互换容器 vector预留空间

    1 //vector 容器构造 vector赋值操作 vector 容量大小 vector插入和删除 2 //vector数据存取 vector互换容器 vector预留空间 3 #include&l ...

  6. spring重点后置处理器

    1. DefaultListableBeanFactory的作用: 默认实现了ListableBeanFactory和BeanDefinitionRegistry接口,基于bean definitio ...

  7. 1、eureka的注册流程

    客户端注册到服务端是通过http请求的 涉及到多级缓存 register注册表 源码精髓:多级缓存设计思想 在拉取注册表的时候: 首先从ReadOnlyCacheMap里查缓存的注册表. 若没有,就找 ...

  8. GitHub访问地址映射更新的时候刷新DNS

    1.windows系统 上设置地址映射 Window系统本地可以安装 Git Bash 方便本地管理仓,或下载Git 上的代码,在访问Git的时候经常出现Git访问主页加载不了等问题.需要设置在本地设 ...

  9. golang开发:环境篇(三)开发利器Goland安装

    这节主要介绍下golang开发的最主要的IDE,Goland.可以有效提高开发效率.用过一段时间 IntelliJ+GO插件,其实功能上跟goland差不多.不过团队的其它开发者基本都是Goland, ...

  10. Springboot+POI实现excel生成下载进阶版(单元格合并,多Sheet,各种样式处理)

    上周五来了新的需求,基本上我写的还款那一系列流程不要了(我好悲伤,当时写了很久的,逻辑复杂的写的我很骄傲),新的变成如上所示(仅仅一部分),勾选几笔后生成一个excel表格,不同的融资编号所引发的那堆 ...