对于每个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. 膜 社论(egg drop)

    题面 \(n\) 楼 \(m\) 个鸡蛋,从 \(k\) 楼及以上扔下去会碎,不能再测试 . 问至少需要扔几次确定 \(k\) . \(n\le 10^{18}\),\(m\le 64\) . 题解 ...

  2. centos安装torch==1.4.0与相关细节

    对于某些直接安装torch==1.4.0报错的情况(没错,就是我遇到了) 在网上查找了,大概的解决方法是先安装一个低版本的torch和torchvision, torchvision是pytorch中 ...

  3. resubmit 渐进式防重复提交框架简介

    resubmit resubmit 是一款为 java 设计的渐进式防止重复提交框架. 推荐阅读: 面试官:你们的项目中是怎么做防止重复提交的? resubmit 渐进式防重复提交框架简介 创作目的 ...

  4. 使用fontforge修改字体,只保留数字

    设计图上的数字采用了Roboto字体,原字体文件200多k,而小程序主包最大2m,承受不起这么大的字体.因为只用到了数字,所以可以使用fontforge编辑字体,删除多余的部分. 一.下载并安装fon ...

  5. 使用Fiddler劫持网络资源为前端开发助力(示例:Dynamic CRM 表单开发 也能热更新? )

    背景: 使用过vue开发的童鞋应该都知道,在开发vue项目的过程中,有个叫"热更新"的功能特别爽,在传统html开发到初次接触vue时,才发现原来前端开发可以这么香.热更新的表现形 ...

  6. 关于stm32f10xRB系列的PB5和PB12外设冲突问题

      上周在公司做了一个项目,调试一个mcu,本以为很简单的调试一下裸机驱动,但是调试过程中遇到了一些问题让我觉得比较有意思,记录一下. 1.关于stm32的SMBUS功能的介绍   由于笔者也没有玩过 ...

  7. Spring5事务管理

    事务管理是什么? 相当于过滤器,如果这一进程中上一个操作正常执行完后提交数据已经发生改变,但是下一个操作中出现了异常,这样就会影响数据的查看. 典型例子:银行转账,甲方已经转钱给乙方(甲方已扣钱),乙 ...

  8. KingbaseES R6 集群创建流复制只读副本库案例

    一.环境概述 [kingbase@node2 bin]$ ./ksql -U system test ksql (V8.0) Type "help" for help. test= ...

  9. KingbaseFlySync 无主键过滤器custompkey配置

      无主键过滤器custompkey配置 1.执行如下命令:repkeyclean -dbtype kingbase8 -host 192.168.11.15 -port 54321 -user sy ...

  10. 【读书笔记】C#高级编程 第二章 核心C#

    (一)第一个C#程序 创建一个控制台应用程序,然后输入代码,输入完毕后点击F5 Console.WriteLine();这条语句的意思:把括号内的内容输出到界面上: Console.ReadKey() ...