题目链接

依旧是树形dp啦,一样的找根节点然后自下而上更新即可

设\(dp_{i,0}\)表示第i个不设,\(dp_{i,1}\)表示第i个设一个,容易得到其状态转移

\(dp_{i,0} = \sum{dp_{j,1}}(j为i的儿子节点)\)

\(dp_{i,1} = 1 + \sum{min(dp_{j,0}, dp_{j,1})}(j为i的儿子节点)\)

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std; const int maxn = 1507;
vector<int> son[maxn];
int in[maxn], dp[maxn][2]; void dfs(int fa) {
dp[fa][0] = 0;
dp[fa][1] = 1;
for(int i = 0; i < son[fa].size(); ++i) {
int v = son[fa][i];
dfs(v);
dp[fa][1] += min(dp[v][0], dp[v][1]);
dp[fa][0] += dp[v][1];
}
} void run_case() {
int n;
while(cin >> n) {
memset(dp, 0, sizeof(dp)), memset(in, 0, sizeof(in));
for(int i = 0; i < n; ++i) {
int fa, num;
scanf("%d:(%d)", &fa, &num);
son[fa].clear();
for(int j = 0; j < num; ++j) {
int v;
scanf("%d", &v);
in[v]++;
son[fa].push_back(v);
}
}
for(int i = 0; i < n; ++i)
if(!in[i]) {
dfs(i);
cout << min(dp[i][0], dp[i][1]) << "\n";
break;
}
} } int main() {
//ios::sync_with_stdio(false), cout.tie(0);
cout.flags(ios::fixed);cout.precision(10);
run_case();
//cout.flush();
return 0;
}

最新文章

  1. Lintcode 75.寻找峰值
  2. 使用maven将代码到私服
  3. SQL总结系列
  4. Github-素材篇
  5. Linux查看硬盘型号
  6. CoreException: Could not calculate build plan: Plugin org.apache.maven.plugins:maven-compiler-plugin:3.1 or one of its dependencies could not be resolved
  7. string.Format 格式化输出日期
  8. PHP数组操作大全
  9. Client Dependency学习
  10. jquery批量控制form禁用的代码
  11. 详解HTTP中的摘要认证机制(转)
  12. 食物卡喉别拍背部!救了100多万人性命的“海姆立克急救法&quot;
  13. Codeforces Round #325 (Div. 2) C. Gennady the Dentist 暴力
  14. MyEclips:Struts 2 + Hibernate 4 + SQL Server2008
  15. HTML&amp;CSS基础学习笔记1.10—添加链接
  16. [ios2]发布时去除NSLog打印
  17. Metrics-Java版的指标度量工具
  18. SSM面试题
  19. bzoj2333 离线 + 线段树
  20. Apollo 框架的剖析1

热门文章

  1. c++/cli mixed codes for standard c++ and csharp
  2. Microsoft 常用下载链接
  3. UOJ 34: 多项式乘法(FFT模板题)
  4. NOIP做题练习(day5)
  5. Coloring Colorfully
  6. 基于原生PHP的路由分配实现
  7. 大白话Web三大组件之一Servlet
  8. MyBatis(8)——联表多对一的处理
  9. TinyXML解析
  10. bugku 散乱密码