题目链接:UVA - 1218 Perfect Service

题意

有n台电脑,互相以无根树的方式连接,现要将其中一部分电脑作为服务器,且要求每台电脑必须连接且只能连接一台服务器(不包括作为服务器的电脑),求最少需要多少台电脑作为服务器。

思路

典型的树形dp问题,那么我们来建立模型。
d(u,0):u是服务器,孩子是不是服务器均可
d(u,1):u不是服务器,u的父亲是服务器,u的孩子不能是服务器
d(u,2):u不是服务器且u的父亲不是服务器,u的孩子必须有且仅有一个是服务器。

那么显然的
d(u,0) = 1 + Sum( Min(d(v,1), d(v,0)) ) |v是u的孩子
d(u,1) = Sum(d(v,2))
d(u,2)稍复杂些,因为只能有一个孩子是服务器,所以需要遍历每个孩子为服务器的情况,每一轮遍历都要同时计算其他所有孩子,需要O(N^2)的时间。
显然这样会有很多重复计算的情况,当然可以记忆化来加快速度,但是还有一个更快的小技巧,因为d(u,1)和d(u,2)的唯一区别就是d(u,2)的孩子有一个服务器
那么我们可以得出
d(u,2) = Min(d(u,1)-d(v,2)+d(v,0)) |v是u的孩子
仍是遍历设每个孩子为服务器,每一轮的操作为O(1),总体为O(N)

代码

ps:因为d(u,2)初始要设为无穷大,就设了0x3f3f3f3f,结果改成N就好了,找了好久才找出问题出在这,因为这个wrong了好多遍,但还是不知道为什么会wrong,知道原因的道友请不吝指点。

第一遍a的代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <map>using namespace std;const int N = 10009;
vector<int> g[N];
int dp[N][3];void dfs(int u, int fa)
{for(int i=0; i<g[u].size(); i++){if(g[u][i] != fa)dfs(g[u][i], u);}dp[u][0] = 1;dp[u][1] = 0;dp[u][2] = N;for(int i=0; i<g[u].size(); i++){if(g[u][i] != fa){dp[u][0] += min(dp[g[u][i]][0], dp[g[u][i]][1]);dp[u][1] += dp[g[u][i]][2];}}bool f = true;for(int i=0; i<g[u].size(); i++){if(g[u][i] != fa){f = false;dp[u][2] = min(dp[u][2], dp[u][1]+dp[g[u][i]][0]-dp[g[u][i]][2]);}}
}int main()
{int n;while(cin>>n){memset(dp, -1, sizeof(dp));int a, b;for(int i=1; i<n; i++){cin>>a>>b;g[a].push_back(b);g[b].push_back(a);}dfs(1, -1);cout<<min(dp[1][0], dp[1][2])<<endl;cin>>a;if(a == -1)break;for(int i=1; i<=n; i++)g[i].clear();}return 0;
}

观摩大神代码后进行修改的精简版

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <map>using namespace std;const int N = 10009;
vector<int> g[N];
int dp[N][3];void dfs(int u, int fa)
{dp[u][0] = 1;dp[u][1] = 0;dp[u][2] = N;for(int i=0; i<g[u].size(); i++){if(g[u][i] != fa){dfs(g[u][i], u);dp[u][0] += min(dp[g[u][i]][0], dp[g[u][i]][1]);dp[u][1] += dp[g[u][i]][2];}}for(int i=0; i<g[u].size(); i++){if(g[u][i] != fa)dp[u][2] = min(dp[u][2], dp[u][1]+dp[g[u][i]][0]-dp[g[u][i]][2]);}
}int main()
{int n;while(cin>>n){int a, b;for(int i=1; i<n; i++){cin>>a>>b;g[a].push_back(b);g[b].push_back(a);}dfs(1, -1);cout<<min(dp[1][0], dp[1][2])<<endl;cin>>a;if(a == -1)break;for(int i=1; i<=n; i++)g[i].clear();}return 0;
}

UVA - 1218 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

    题意:有n个机器组成的树形结构,要求一台服务器必须连接一台电脑,求使用的最少的服务器.. 思路: 树形DP,和前面的有道题目类似.在dfs遍历树的时候找到选当前结点和不选当前节点的最大状态,多一个两个 ...

  3. [树形DP | Uva 1218]Perfect Service

    dp[i][0]表示以i为根的且i被选为服务器的最小服务器数 dp[i][1]表示以i为根且i不被选为服务器,而i父亲为服务器的最小服务器数 dp[i][2]表示以i为根且i不被选为服务器,而i父亲也 ...

  4. uva 10859 放置街灯树形dp

    首先,本题的优化目标有两个:放置的街灯a应该尽量少:被两灯同时照亮的边数b应该尽量大.为了统一起见,我们把后者替换为:恰好被一盏灯照亮的边数c应该尽量小,然后改用x = Ma+c作为优化目标,其中一个 ...

  5. Placing Lampposts UVA - 10859 放置街灯 树形dp

    As a part of the mission 'Beautification of Dhaka City', the government has decided to replace all t ...

  6. Perfect service(树形dp)

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

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

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

  8. Party at Hali-Bula UVA - 1220(树形dp)

    题目链接:传送门 思路:求最多参与人数是树形dp的入门题,和没有上司的舞会是一个题目,但是这个题目还要求答案是否唯一.我们开设一个标记数组vis,标记就可以了.具体解释看代码: #include< ...

  9. 紫书动规 例题9-13 UVA - 1220 Party at Hali-Bula 树形dp

    题目链接: https://vjudge.net/problem/UVA-1220 题意: 题解: 树形dp: 树的最大独立集问题 d[u][0]:=不选u能得到的最大人数 d[u][0]=sum{m ...

最新文章

  1. 7.1.15 单双击事件
  2. Window 10 :如何彻底关闭:Windows Defender Service(2015-12-20日更新)
  3. CentOS 7安装GNOME图形界面并设置默认启动
  4. 我国数据中心产业发展“渐入佳境” 服务是重中之重
  5. 中国数学竞赛史上最玩命的“赌徒”,为了国家荣誉,他不惜用生命换来了五次世界第一...
  6. 如何存储和恢复 HTML5 Canvas 状态
  7. HBase shell命令行
  8. 利用Linux命令和perl脚本批量将文件重命名
  9. 浅谈百度司南大数据企业的风向标
  10. 【java】java基础之SPI框架实现-整体设计
  11. StringHelper--封转自己的字符串工具类
  12. entity framework 动态条件
  13. 掌握这些,你也可以轻松扒谱(上)
  14. c语言课程设计歇后语,拼音字母c开头的歇后语
  15. 计算机校本培训 培训总结,校本培训工作总结(2015—2016学年度)
  16. 各大型网站反爬虫策略
  17. VM打开虚拟机VMX进程已提前退出错误及解决办法
  18. 基于大数据的精准营销与应用场景
  19. 你知道二维码的图案原理吗?
  20. js删除数组中的指定对象

热门文章

  1. Mysql数据库报错:Row size too large ( 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DY
  2. RNA-seq连特异性
  3. 小程序权限设置:小程序下载图片保存到相册拒绝权限后,再次打开权限的解决方案
  4. 拥抱AI,“纳德拉式”的微软复兴之路 | 人工智能观察
  5. AssertionError: WARNING: No labels found in ** Can not train without labels.
  6. 计算机组成原理研究生试题三,计算机组成原理研究生入学试题.doc
  7. 【MySQL】多表查询策略(多表联查子查询)
  8. 宇信易诚 为何成长如此之快
  9. JAVA学习05-类型转换
  10. 知物由学 | 易盾SaaS系统资损防控体系建设