树形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 ;
}

最新文章

  1. Python’s SQLAlchemy vs Other ORMs[转发 5] PonyORM
  2. 有关基于模型的设计(MBD)一些概念和理解(zz)
  3. 【Cocos2d-X开发学习笔记】第09期:渲染框架之菜单类(CCMenu)的使用
  4. Maven--几个需要补充的问题(三)
  5. SignalR + KnockoutJS + ASP.NET MVC 实现井字游戏
  6. Caffe代码分析--crop_layer.cu
  7. 三级级联查询省份名称和编码(保证名称不重复)的SQL语句
  8. CentOS7.2下Nginx的使用
  9. 使用FFMPEG在windows平台下推rtmp流
  10. Javascript实现的数组降维——维度不同,怎么谈恋爱(修订版)
  11. 【原创】VirtualBox 磁盘扩容教程
  12. SpringBoot入门示例
  13. 软件开发中 SQL SERVER 任务的用法
  14. Nginx作为负载均衡器upstream
  15. Environment.GetEnvironmentVariable
  16. VBA7种文档遍历法
  17. 「BZOJ 4502」串
  18. 禁止sethc.exe运行 防止3389的sethc后门
  19. 10、Java并发编程:并发容器之ConcurrentHashMap
  20. SDUST OJ Problem G 动态的字符串排序

热门文章

  1. Maven自动部署(SCM-SVN/Git)(maven-scm-plugin/maven-release-plugin插件的使用)
  2. [置顶] 内存管理一点也不神秘————手绘iOS内存管理细节
  3. 关于linter
  4. OD调试器调试Delphi程序按钮事件断点方法
  5. Android电子书项目实训【项目说明】【1】
  6. JDBC连接MySQL数据库的示例代码
  7. 自己动手写CPU之第九阶段(4)——载入存储指令实现思路
  8. RESTful Web Service
  9. yii使用CUploadedFile上传文件
  10. string方法 PadLeft 返回一个新字符串,该字符串通过在此实例中的字符左侧填充指定的 Unicode 字符来达到指定的总长度,从而使这些字符右对齐。 PadRight 右边