对于每个u要设置三维。

dp[u][0]表示u是服务器,以u为根的最小服务器数,其子节点既可以是,也可以不是,dp[u][0]+=min(d[v][0],d[v][1]);

dp[u][1]表示u不是服务器,但他的父节点时,此时u的子节点都不可能是,dp[u][1]+=dp[v][2];

dp[u][2]表示u及其父亲都不是服务器,u的子节点只有一个是服务器,枚举这个子节点,dp[u][2]=min(d[u][2],d[v1][2]+d[v2][2]+...+d[v][0]),但是我们这样枚举的话,复杂度是O(k2),我们发现求解dp[u][1]时已经求到了dp[v][2]的总和,那么我们可以借用这个优化到O(k):d[u][2]=min(d[u][2],d[u][1]-d[v][2]+d[v][0]).

最后的求解目标就是min(dp[1][0],dp[1][2]). (将1看成树根)

 1 #include<cstdio>
2 #include<cstring>
3 #include<vector>
4 #include<algorithm>
5 using namespace std;
6 const int maxn=10000+5;
7 int n;
8 vector<int> E[maxn];
9 int dp[maxn][3];
10
11 void dfs(int u,int fa){
12 dp[u][0]=1;//自身是服务器
13 dp[u][1]=0;//自身不是,父亲是
14 dp[u][2]=maxn;//自己和父亲都不是
15 int k=E[u].size();
16 if(k==1&&fa!=0) return ;
17 for(int i=0;i<k;i++){
18 int v=E[u][i];
19 if(v==fa) continue;
20 dfs(v,u);
21 dp[u][0]+=min(dp[v][0],dp[v][1]);
22 dp[u][1]+=dp[v][2];
23 }
24 for(int i=0;i<k;i++){
25 int v=E[u][i];
26 if(v==fa) continue;
27 dp[u][2]=min(dp[u][2],dp[u][1]-dp[v][2]+dp[v][0]);
28 }
29 }
30
31 int main(){
32 int u,v;
33 while(~scanf("%d",&n)){
34 for(int i=1;i<=n;i++) E[i].clear();
35 for(int i=1;i<n;i++){
36 scanf("%d%d",&u,&v);
37 E[u].push_back(v);
38 E[v].push_back(u);//正反向边都要建
39 }
40 dfs(1,0);//哪个节点作为树根并不影响
41 printf("%d\n",min(dp[1][0],dp[1][2]));
42 scanf("%d",&u);
43 if(u==-1) break;
44 }
45 return 0;
46 }

POJ3398 Perfect Service (树形DP)的更多相关文章

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

    题目链接:id=36043">UVA - 1218 Perfect Service 题意 有n台电脑.互相以无根树的方式连接,现要将当中一部分电脑作为server,且要求每台电脑必须连 ...

  2. UVA - 1218 Perfect Service (树形dp)(inf相加溢出)

    题目链接 题意:给你一个树形图,让你把其中若干个结点染成黑色,其余的染成白色,使得任意一个白色结点都恰好与一个黑色结点相邻. 解法比较容易,和树上的最大独立集类似,取一个结点作为树根,对每个结点分三种 ...

  3. POJ3398Perfect Service[树形DP 树的最大独立集变形]

    Perfect Service Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1518   Accepted: 733 De ...

  4. Perfect service(树形dp)

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

  5. UVA-1220-Party at Hali-Bula && UVA-1218-Perfect Service(树形DP)

    UVA-1220-Party at Hali-Bula 题意: 一个公司员工要举行聚会,要求任意一个人不能和他的直接上司同时到场,一个员工只有一个支系上司,现在求最多有多少人到场,并且方案是否唯一(紫 ...

  6. lightoj 1201 - A Perfect Murder(树形dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1201 题解:简单的树形dp,dp[0][i]表示以i为根结点不傻i的最多有多少 ...

  7. Perfect Service [POJ 3398]

    Perfect Service 描述 网络由N个通过N-1个通信链路连接的计算机组成,使得任何两台计算机可以通过独特的路由进行通信.如果两台计算机之间存在通信链路,则称这两台计算机是相邻的.计算机的邻 ...

  8. POJ 3398 Perfect Service(树型动态规划,最小支配集)

    POJ 3398 Perfect Service(树型动态规划,最小支配集) Description A network is composed of N computers connected by ...

  9. POJ 1849 - Two - [DFS][树形DP]

    Time Limit: 1000MS Memory Limit: 30000K Description The city consists of intersections and streets t ...

随机推荐

  1. Linux安装mysql8.0.29详细教程

    ​ 我在上午卸载了陪伴我多年的mysql5.7,现在准备安装mysql8.0. 一.登录mysql官网下载mysql安装包(我的系统是Centos7) MySQL :: Download MySQL ...

  2. 8月份的.NET Conf 活动 专注于 .NET MAUI

    .NET Conf:Focus on MAUI 是一个为期一天的免费直播活动,将于太平洋时间 8 月 9 日上午 9 点开始,来自社区和 Microsoft 团队的演讲者们将分享使用MAUI .了解. ...

  3. 分享一款免费OPC UA服务器

    OPC UA基于OPC基金会提供的新一代技术,提供安全,可靠和独立于厂商的,实现原始数据和预处理的信息从制造层级到生产计划或ERP层级的传输.通过OPC UA,所有需要的信息在任何时间,任何地点对每个 ...

  4. js中数组去重的方法

    在实际工作或面试中,我们经常会遇到"数组去重"问题,接下来就是使用js实现的数组去重的多种方法: 1.借助ES6提供的Set结构 var arr = [1,1,2,2,3,3,4, ...

  5. Luogu1856 [USACO5.5]矩形周长Picture (线段树扫描线)

    对于横轴,加上与上一次扫描的差值:对于竖轴,加上高度差与区间内不相交线段\(*2\)的积: 难点在pushdown,注意维护覆盖关系.再就注意负数 #include <iostream> ...

  6. Elasticsearch-Kibana-学习笔记

    1.背景 1.1 简介 Elasticsearch 是一个分布式.高扩展.高实时的搜索与数据分析引擎.它能很方便的使大量数据具有搜索.分析和探索的能力.充分利用Elasticsearch的水平伸缩性, ...

  7. java-面向对象之类、对象

    什么是类?什么是对象? 1)现实世界是由很多很多对象组成的基于对象抽出了类 2)对象:真实存在的单个的个体 类:类别/类型,代表一类个体 3)类中可以包含: 3.1)所有对象所共有的属性/特征---- ...

  8. 论文翻译:2020_Lightweight Online Noise Reduction on Embedded Devices using Hierarchical Recurrent Neural Networks

    论文地址:基于分层递归神经网络的嵌入式设备轻量化在线降噪 引用格式:Schröter H, Rosenkranz T, Zobel P, et al. Lightweight Online Noise ...

  9. 从C过渡到C++(1)——GNU/Linux

    从C过渡到C++(1)--GNU/Linux 目录 从C过渡到C++(1)--GNU/Linux 大名鼎鼎的GNU/Linux GNU GNU的组成 一点补充 MinGW 运行时库 额外的内容 Min ...

  10. 数据库简介与MySQL简介

    MySQL简介 数据存取演变史 起源······文本文件 在最开始使用计算机都没有相应的规范我们的数据一般都是自己起一个名字然后就根据这个路径存储数据并且存储数据的格式也都五花八门就产生了很多奇奇怪怪 ...