传送门

题目分析

题意:给一颗无根树,选择最少的节点将所有的边覆盖。

经典的树型DP,dp[i][0/1]表示选择或不选择i号节点的最优值。

当选择了i号节点,他的子节点可选可不选,选择最优的。

当不选择i号节点,他的子节点必须被选。

最优返回dp[1][0]和dp[1][1]的较小值。

code

#include<bits/stdc++.h>
using namespace std; const int N = 1500;
int n;
int ecnt, adj[N + 5], go[N * 2 + 5], nxt[N * 2 + 5];
int dp[N + 5][2]; inline void addEdge(int u, int v){
nxt[++ecnt] = adj[u], adj[u] = ecnt, go[ecnt] = v;
nxt[++ecnt] = adj[v], adj[v] = ecnt, go[ecnt] = u;
} inline void DP(int u, int f){
if(u == 0) return;
dp[u][0] = 0;
dp[u][1] = 1;
for(int e = adj[u]; e; e = nxt[e]){
int v = go[e];
if(v == f) continue;
DP(v, u);
dp[u][0] += dp[v][1];
dp[u][1] += min(dp[v][0], dp[v][1]);
}
} int main(){
ios::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
cin >> n;
for(int i = 1; i <= n; i++){
int x, k, y;
cin >> x >> k;
x++;
for(int j = 1; j <= k; j++){
int p; cin >> p;
p++;
addEdge(x, p);
}
}
DP(1, 0);
cout << min(dp[1][0], dp[1][1]) << endl;
return 0;
}

最新文章

  1. Vim找不到配色文件的解决方法
  2. Codeforces Round #143 (Div. 2)
  3. spring + Quartz定时任务配置
  4. Knockout.js 初探
  5. linux 用grep匹配横线
  6. 戴建钊 201521123023《Java程序设计》第2周学习总结
  7. Java框架之Hibernate(一)
  8. 云数据库POLARDB优势解读之①——10分钟了解
  9. 什么是JDK?什么是JRE?JDK与JRE的区别和用途
  10. JSON数据提取
  11. (转)Understanding, generalisation, and transfer learning in deep neural networks
  12. linux Centos 服务器之间NFS文件共享挂载
  13. 微服务之springCloud-docker-hystrix-dashboard-turbine(九)
  14. gdb 调试main
  15. webbench-1.5_hacking
  16. Java 集合之 Map
  17. 线性判别分析(Linear Discriminant Analysis, LDA)算法分析
  18. 【WPF】动态设置Binding的ConverterParameter转换器参数
  19. jQuery 发送 ajax json 请求。。
  20. Mac/win下的docker容器和LAMP环境的安装(亲测)

热门文章

  1. ORA-16009 remote archive log destination must be a STANDBY database
  2. 有关Canvas的一点小事--鼠标绘图
  3. nodejs连接mysql突然中断问题解决方案
  4. hadoop 2.4.1 集群安装二
  5. iOS_04_数据类型、常量、变量
  6. sea.js五分钟上手
  7. C#利用反射机制,获取实例的属性和属性值
  8. oracle高效分页存储过程(百万数据级)
  9. kafka集群操作指南
  10. [转载]MVC中单用户登录