#树形dp#nssl 1469 W

分析
首先一些结论,每条边最多被翻一次,而且由翻的边所构成的连通块答案就是度数为奇数的点的个数的一半,
因为在连通块内必然选择两个叶子节点间的路径翻是最优的,所以也就是选择两个度数为奇数的点,所以结论很显然
设\(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的更多相关文章
- [NOIP10.3模拟赛]3.w题解--神奇树形DP
题目链接: 咕 闲扯: 这题考场上把子任务都敲满了,5个namespace,400行11k 结果爆0了哈哈,因为写了个假快读只能读入一位数,所以手测数据都过了,交上去全TLE了 把边分成三类:0. 需 ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- HDU4003Find Metal Mineral[树形DP 分组背包]
Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Other ...
- NOIP2011pj表达式的值[树形DP 笛卡尔树 | 栈 表达式解析]
题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...
- 【BZOJ-3572】世界树 虚树 + 树形DP
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1084 Solved: 611[Submit][Status ...
- 【BZOJ-2286】消耗战 虚树 + 树形DP
2286: [Sdoi2011消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2120 Solved: 752[Submit][Status] ...
- 【BZOJ-2435】道路修建 (树形DP?)DFS
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3115 Solved: 1002[Submit][Statu ...
随机推荐
- React Native如何每次唤醒APP都执行一段代码
最近想要做一个类似于淘宝每次打开会根据用户剪贴板内容弹出对应商品的功能.要完成这个功能需要每次唤醒APP都读取一次剪贴板. 1.监听 && 销毁 1 async componentDi ...
- VMware虚拟机Ubuntu系统如何占满整个屏幕
VMware虚拟机Ubuntu系统分辨率调节 桌面右击--Disoplay Settings 选择一个跟本机系统一样或者相近的.(本机小米笔记本win11,具体看自己的情况) 结束.
- ABP开发需要用到的命令
0.命令行在哪里执行? 在Visual Studio的"解决方案资源管理器"的解决方案或者项目上点鼠标右键,选择"在终端中打开". 1.安装abp的命令行 官网 ...
- 【Azure Redis】中国区Redis在东三区的资源无法在通过门户上与北三区资源之间建立灾备链接
问题描述 为应用启用灾备管理,在北三区建立了一个Azure Redis,同时,在东三区也建立了一个同样的Prem级Redis服务.但是在建立灾备(DR:Disease Recovery)时候,却无法选 ...
- SQLmap 爆破
1.Sqlmap -u "http://114.67.246.176:11055/index.php?" --data="id=1" (这里 --dat ...
- 使用C#和MemoryCache组件实现轮流调用APIKey以提高并发能力
文章信息 标题:使用C#和MemoryCache组件实现轮流调用API Key以提高并发能力的技巧 摘要:本文介绍了如何利用C#语言中的MemoryCache组件,结合并发编程技巧,实现轮流调用多个A ...
- [学习笔记] Rocket.Chat 安装与设置启动项
这篇文章主要介绍手动安装的方式来安装Rocket.Chat,在Rocket.Chat官方有三种安装方式, 面向开发人员的直接使用meteor部署 传统的源码编译安装 Docker方式部署 接下来分别介 ...
- Android 优雅的Activity回调代码封装
原文地址: Android 优雅的Activity回调代码封装 - Stars-One的杂货小窝 之前提到Jetpack架构组件学习(3)--Activity Results API使用 - Star ...
- Java/Kotlin 实现控制台输出日志保存到文件
原文:Java/Kotlin 实现控制台输出日志保存到文件 | Stars-One的杂货小窝 之前开发的几款软件,用户用着的过程中,偶尔会存在报错问题,想保留一份日志出来,之后可由用户发过来,进行问题 ...
- 【2310. 个位数字为 K 的整数之和】背包
import java.util.*; class Solution { public static void main(String[] args) { Solution solution = ne ...