Perfect service(树形dp)

有n台机器形成树状结构,要求在其中一些机器上安装服务器,使得每台不是服务器的计算机恰好和一台服务器计算机相邻。求服务器的最小数量。n<=10000。

这种类似独立集的树形dp问题,都可以将同一个结点的状态分成几类。这里用\(f[i][0]\)表示i是服务器,\(f[i][1]\)表示i不是服务器,但是i的父亲是服务器。\(f[i][2]\)表示i和i的父亲都不是服务器。

那么就可以写出转移方程:\(f[i][0]=sum(min(f[v][0], f[v][1]))+1\),\(f[i][1]=sum(f[v][2])\),\(f[i][2]=min(f[i][1]-f[v][2]+f[v][0])\)。时间复杂度为\(O(n)\)。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int maxn=1e4+5;int cntedge, fir[maxn];
struct Edge{int to, next;
}e[maxn];
void RESET(){ cntedge=0; memset(fir, 0, sizeof(fir)); }
void addedge(int x, int y){Edge &e1=e[++cntedge];e1.to=y; e1.next=fir[x]; fir[x]=cntedge;
}int n, f[maxn][3];  //0:自己是 1:父亲是 2:自己和父亲都不是
\
//也可以保存访问顺序,在外部访问
void dfs(int u, int par){f[u][0]=1; f[u][1]=0;f[u][2]=n; int v;for (int i=fir[u]; i; i=e[i].next){if ((v=e[i].to)==par) continue;dfs(v, u);f[u][0]+=min(f[v][0], f[v][1]);f[u][1]+=f[v][2];}for (int i=fir[u]; i; i=e[i].next){if ((v=e[i].to)==par) continue;f[u][2]=min(f[u][2], f[u][1]-f[v][2]+f[v][0]);}
}int main(){int t1=0, t2;while (~t1&&~scanf("%d", &n)){RESET();for (int i=1; i<n; ++i){scanf("%d%d", &t1, &t2);addedge(t1, t2); addedge(t2, t1); }dfs(1, 0);printf("%d\n", min(min(f[1][0], f[1][1]), f[1][2]));scanf("%d", &t1);}return 0;
}

转载于:https://www.cnblogs.com/MyNameIsPc/p/8867142.html

Perfect service(树形dp)相关推荐

  1. uva 1218 Perfect Service 树形dp

    // uva 1218 Perfect Service 树形dp // // 解题思路: // // d[u][0]表示节点本身是服务器 // d[u][1]表示节点的父节点是服务器 // d[u][ ...

  2. UVA - 1218 Perfect Service(树形dp)

    题目链接:UVA - 1218 Perfect Service 题意 有n台电脑,互相以无根树的方式连接,现要将其中一部分电脑作为服务器,且要求每台电脑必须连接且只能连接一台服务器(不包括作为服务器的 ...

  3. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  4. 【学时总结】◆学时·VIII◆ 树形DP

    ◆学时·VIII◆ 树形DP DP像猴子一样爬上了树--QwQ ◇ 算法概述 基于树的模型,由于树上没有环,满足DP的无后效性,可以充分发挥其强大统计以及计算答案的能力. 一般来说树形DP的状态定义有 ...

  5. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  6. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  7. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  8. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  9. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

最新文章

  1. JavaScript学习笔记 - 入门篇(1)- 准备
  2. 柱状图中xy轴怎么出现_烤烟烘烤中出现叶片发霉怎么办?
  3. from flask.ext.wtf import Form 报错 ModuleNotFoundError: No module named 'flask.ext'
  4. K-Means ++ 和 kmeans 区别
  5. php实现tail,Linux-如何用php实现Linux下的tail -f命令?
  6. 三十四、R语言数据分析实战
  7. Android NFC读取电子标签
  8. 内存溢出,频繁full gc 处理思路
  9. cd linux给u盘安装程序,使用U盘安装CDlinux
  10. 平流式初沉池贮砂斗计算_?初沉池、二沉池的作用与区别-亨孚科技
  11. 造谣无下限!众泰汽车被“破产”,官方声明:子虚乌有 已报案
  12. ajax中的简单get请求,jquery 之ajax,get,post异步请求简单代码模版(示例代码)
  13. 付忠庆的练习小笔记-Codeforces #276 Div2 C
  14. [整理]CHttpConnection的使用
  15. bat之启动与禁用网卡
  16. js:变量,作用域以及内存问题
  17. 学生签到系统c代码_C语言之学生管理系统代码(完整)
  18. Linux磁盘管理之GPT分区,Linux磁盘管理之GPT分区
  19. C#串口开发案例:迈瑞血球分析仪
  20. 程序员在技术之外,还要掌握一个技能——自我营销能力

热门文章

  1. 推荐最近收藏的几篇文章(r12笔记第85天)
  2. Xamarin XAML语言教程Visual Studio中实现XAML预览
  3. Bzoj3060 [Poi2012]Tour de Byteotia
  4. Android 使用Toolbar+DrawerLayout快速实现仿“知乎APP”侧滑导航效果
  5. Howto: Deploy VC2008 apps without installing vcredist_x86.exe
  6. linux环境变量查询设置及保存
  7. 安装IE8不能调试VS2005的解决办法
  8. ZYNQ-7000如何生成从Flash和SD卡启动的镜像文件
  9. 简介nandflash、norflash、ram、sram、dram、rom、eeprom、flash的区别
  10. 语音识别可以直接编码吗