bzoj1304
2024-10-22 07:36:22
树形dp
题目是要求最深的颜色
先开始觉得设dp[i][0/1/2]表示这个点的状态,然后发现没办法保证该点是最深的点,且dp状态没有实际意义,其实dp[i][0/1]表示当前i的子树颜色为c^1的叶子结点都已经染好了,现在颜色为c的还没染好,注意当前i节点还没有染色,那么dp[i][0]=min(dp[j][0],dp[j][1]+1),表示j为根的子树白色还没染好,黑色染好了,那么当前到i还是没染好,也就不用把i节点染色,继续保持没有染好的状态,d[j][1]+1表示j的子树中0染好了,1没染好,那么现在变成1已经染好而0没有染好,所以必须染一个1,那么操作数量+1,也就把j子树中的1染好了
最后就是min(dp[root][0],dp[root][1])+1,+1是因为dp状态表示当前树中还有一种颜色没染好,所以必须染一次,+1,这里节点没有染色是由dp[i][0]=dp[j][0],表示当前i节点暂时不染色。保证子树中一种颜色染好而另一种颜色没有染好是由dp初值保证的,叶子结点dp[i][c]=0,dp[i][c^1]=inf,表示不存在的颜色不存在没有染好的情况。
#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n, m;
int dp[N][], c[N];
vector<int> G[N];
void dfs(int u, int last)
{
if(u <= m)
{
dp[u][c[u] ^ ] = << ;
return;
}
for(int i = ; i < G[u].size(); ++i)
{
int v = G[u][i];
if(v == last) continue;
dfs(v, u);
dp[u][] += min(dp[v][], dp[v][] + );
dp[u][] += min(dp[v][], dp[v][] + );
}
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= m; ++i) scanf("%d", &c[i]);
for(int i = ; i < n; ++i)
{
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(n, );
printf("%d\n", min(dp[n][], dp[n][]) + );
return ;
}
最新文章
- Python’s SQLAlchemy vs Other ORMs[转发 5] PonyORM
- 有关基于模型的设计(MBD)一些概念和理解(zz)
- 【Cocos2d-X开发学习笔记】第09期:渲染框架之菜单类(CCMenu)的使用
- Maven--几个需要补充的问题(三)
- SignalR + KnockoutJS + ASP.NET MVC 实现井字游戏
- Caffe代码分析--crop_layer.cu
- 三级级联查询省份名称和编码(保证名称不重复)的SQL语句
- CentOS7.2下Nginx的使用
- 使用FFMPEG在windows平台下推rtmp流
- Javascript实现的数组降维——维度不同,怎么谈恋爱(修订版)
- 【原创】VirtualBox 磁盘扩容教程
- SpringBoot入门示例
- 软件开发中 SQL SERVER 任务的用法
- Nginx作为负载均衡器upstream
- Environment.GetEnvironmentVariable
- VBA7种文档遍历法
- 「BZOJ 4502」串
- 禁止sethc.exe运行 防止3389的sethc后门
- 10、Java并发编程:并发容器之ConcurrentHashMap
- SDUST OJ Problem G 动态的字符串排序
热门文章
- Maven自动部署(SCM-SVN/Git)(maven-scm-plugin/maven-release-plugin插件的使用)
- [置顶] 内存管理一点也不神秘————手绘iOS内存管理细节
- 关于linter
- OD调试器调试Delphi程序按钮事件断点方法
- Android电子书项目实训【项目说明】【1】
- JDBC连接MySQL数据库的示例代码
- 自己动手写CPU之第九阶段(4)——载入存储指令实现思路
- RESTful Web Service
- yii使用CUploadedFile上传文件
- string方法 PadLeft 返回一个新字符串,该字符串通过在此实例中的字符左侧填充指定的 Unicode 字符来达到指定的总长度,从而使这些字符右对齐。 PadRight 右边