当前位置: 首页 > news >正文

题解:P14309 【MX-S8-T2】配对

题解:P14309 【MX-S8-T2】配对

思路

注:本文中黑色节点即为 ci=1c_i=1ci=1 的节点,白色节点为 ci=0c_i=0ci=0 的节点。

先考虑没有修改的情况。

如果在以 xxx 为根的一颗子树内有偶数个黑色节点,则 xxx 与他的父节点之间的边对答案没有贡献,因为该子树内的黑色节点之间可以两两匹配,这种情况一定比子树内的黑色节点连到外面更优。如果黑色节点个数为奇数,则一定有且仅有一个黑色节点连到子树外的黑色节点,这时需要经过 xxx 与其父节点的连边一次,所以这条边对答案有贡献。

再考虑修改的情况。

修改中交换两点的颜色实际上是将两点的颜色反转,可以视为将一个黑色节点变白,将一个白色节点变黑。不过还要注意如果一开始黑色节点数量为奇数,我们需要无视一个黑色节点,即多将一个黑色节点变白。

dpx,i,jdp_{x,i,j}dpx,i,j,表示以 iii 为根的子树中将 iii 个节点变白,将 jjj 个节点变黑时 rrr 的最小值。

转移方程就比较简单了,输出时当黑色节点总数为奇数时输出 min⁡(dprt,1,0,dprt,2,1)\min(dp_{rt,1,0},dp_{rt,2,1})min(dprt,1,0,dprt,2,1),为偶数时输出 min⁡(dprt,0,0,dprt,1,1)\min(dp_{rt,0,0},dp_{rt,1,1})min(dprt,0,0,dprt,1,1)

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,c[1000010],sz[1000010];
ll dp[1000010][3][2],u[1000010][3][2];
struct N{int y;ll v;
};
vector<N> e[1000010];
inline ll min(ll a,ll b){return a<b?a:b;}
void dfs(int x,int xfa){sz[x]=c[x];dp[x][0][0]=dp[x][c[x]&1][c[x]^1]=0;for(N i:e[x])if(i.y!=xfa){int y=i.y,v=i.v;dfs(y,x);sz[x]+=sz[y];for(int i=0;i<=2;i++)for(int j=0;j<=1;j++)u[x][i][j]=1e18;for(int i1=0;i1<=2;i1++)for(int i2=0;i2<=2;i2++)for(int j1=0;j1<=1;j1++)for(int j2=0;j2<=1;j2++)if(i1+i2<=2&&j1+j2<=1)u[x][i1+i2][j1+j2]=min(u[x][i1+i2][j1+j2],dp[x][i1][j1]+dp[y][i2][j2]+v*((sz[y]-i2+j2+2)&1));for(int i=0;i<=2;i++)for(int j=0;j<=1;j++)dp[x][i][j]=u[x][i][j];}
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cin>>n;for(int i=1;i<=n;i++)cin>>c[i];for(int i=1,x,y,v;i<n;i++){cin>>x>>y>>v;e[x].push_back({y,v});e[y].push_back({x,v});}for(int x=1;x<=n;x++)for(int i=0;i<=2;i++)for(int j=0;j<=1;j++)dp[x][i][j]=1e18;dfs(1,0);cout<<((sz[1]&1)?min(dp[1][1][0],dp[1][2][1]):min(dp[1][0][0],dp[1][1][1]));return 0;
}
http://www.dtcms.com/a/536185.html

相关文章:

  • SQL之表的增删
  • 【计算机网络核心】TCP/IP模型与网页解析全流程详解
  • HTML 理论系统笔记2
  • 微软Copilot被用于窃取OAuth令牌,AI Agent成为攻击者帮凶
  • 免费网站建站w海口企业自助建站
  • 全球 PyTorch 大会与 Triton 大会释放强信号:算子语言繁荣和分化背后,编译器核心地位日益凸显
  • PyCharm 快速运行 django project
  • 自己动手制作网站外呼电销系统
  • 网站建设出错1004有专门下载地图做方案的网站吗
  • OpenCV C++ 中,访问图像像素三种常用方法
  • MATLAB基于小波云模型时间序列预测,以年径流预测为例
  • 项目名称:烟酒进销存管理系统
  • web开发,在线%蛋糕销售%管理系统,基于asp.net,webform,c#,sql server
  • UE5 蓝图-25:主 mainUI界面蓝图,右侧的颜色按钮的实现,换色逻辑与材质参数集,
  • 腾讯优图开源Youtu-Embedding通用文本表示模型,用处在哪?
  • parser_error UnicodeDecodeError: ‘utf-8‘ codec can‘t decode bytes
  • 慕课网站开发wordpress 当前页面登录密码
  • 从零学习 Agentic RL(四)—— 超越 ReAct 的线性束缚:深入解析 Tree-of-Thoughts (ToT)
  • 宁德城乡建设网站首页无法删除wordpress
  • Spring Boot3零基础教程,天气 API 测试,笔记73
  • 基于 STM32 的智能语音唤醒与关键词识别系统设计 —— 从硬件集成到算法实现
  • Redis数据库基础命令
  • 1.3 StorageTransient的gas计算
  • 物联网技术与基础第六节上课笔记
  • SAP SD系统开票查询报表分享
  • it网站设计培训制作网站的工具
  • 南京网站建设工作室电商卖什么产品有前景
  • iOS 开发推送功能全流程详解 从 APNs 配置到上架发布的完整实践(含跨平台上传方案)
  • 李宏毅机器学习笔记33
  • 深入理解Bitbucket Pipelines:强大的CICD开源解决方案