经典问题系列

覆盖半径\(1\)的最小点覆盖集

\(f[i][0]\) 表示不在此处建信号塔,但\(i\)及其子树都有信号

\(f[i][1]\) 表示在此处建信号塔,但\(i\)及其子树都有信号

\(f[i][2]\) 表示不在在此处建信号塔,但\(i\)子树都有信号,而\(i\)无信号

\(f[p][2]=\sum f[q][0]\)

\(f[p][1]=\sum min(f[q][0],f[q][1],f[q][2])\)

\(f[p][0]=min_q (f[q][1]+\sum_k min(f[k][0],f[k][1]))\)

答案就是 \(min(f[1][0],f[1][1])\)

#include <bits/stdc++.h>
using namespace std; #define int long long
const int N = 1000005;
vector <int> g[N];
int vis[N],f[N][3],t1,t2,t3,n; void dfs(int p) {
vis[p]=1;
int fa=0;
f[p][1]=1;
for(int i=0;i<g[p].size();i++) {
int q=g[p][i];
if(vis[q]==0) {
dfs(q);
f[p][2]+=f[q][0];
f[p][1]+=min(f[q][0],min(f[q][1],f[q][2]));
}
else fa=q;
}
f[p][0]=1e+16;
for(int i=0;i<g[p].size();i++) {
int q=g[p][i];
if(q!=fa) {
int tmp=f[q][1];
for(int j=0;j<g[p].size();j++) {
int k=g[p][j];
if(k!=fa && k!=q) {
tmp += min(f[k][0],f[k][1]);
}
}
f[p][0]=min(f[p][0],tmp);
}
}
} signed main() {
scanf("%lld",&n);
for(int i=1;i<n;i++) {
scanf("%lld%lld",&t1,&t2);
g[t1].push_back(t2);
g[t2].push_back(t1);
}
dfs(1);
cout<<min(f[1][0],f[1][1])<<endl;
}

最新文章

  1. 数论 - Moon Game
  2. Ionic页面加载前 ionic页面加载完成 ionic页面销毁执行的事件
  3. [转]很详细的devexpress应用案例
  4. python 多线程和多核
  5. Windows Server 2008 R2 64bit兼容Chrome浏览器
  6. NTT研发
  7. javascript event兼容IE和FF
  8. 4.Handler之CoreHandler编写
  9. 剑指Offer-按之字形顺序打印二叉树
  10. time-based基于google key生成6位验证码(google authenticator)
  11. IOS开发中将定时器添加到runLoop中
  12. Openstack中RabbitMQ RPC代码分析
  13. Java RedisClient
  14. 23个Python爬虫开源项目代码
  15. python设计模式之门面模式
  16. 【PAT】1052 Linked List Sorting (25)(25 分)
  17. Win32 消息响应顺序
  18. Linux IO调度算法
  19. Python3之urllib模块
  20. spring源码-aop-5

热门文章

  1. position属性值4缺一带你了解相对还是绝对抑或是固定定位
  2. Sap Hana 关于BP的一些理解
  3. system.run
  4. KINDLE 小说下载--超级书库
  5. vuex目录配置
  6. [APIO2018] New Home 新家 [线段树,multiset]
  7. 嵌入式设备sqlite库移植和使用
  8. php根据字段相识度进行排序查询
  9. AMBA简介
  10. generalization error