UVa 1218 - Perfect Service(树形DP)
链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3659
题意:
有n(n≤10000)台机器形成树状结构。要求在其中一些机器上安装服务器,
使得每台不是服务器的计算机恰好和一台服务器计算机相邻。求服务器的最少数量。
分析:
按照每个结点的情况进行分类:
一、d(u,0):u是服务器,则每个子结点可以是服务器也可以不是。
二、d(u,1):u不是服务器,但u的父亲是服务器,这意味着u的所有子结点都不是服务器。
三、d(u,2):u和u的父亲都不是服务器。这意味着u恰好有一个儿子是服务器。
状态转移方程如下(其中v是u的子结点):
d(u,0) = sum{min(d(v,0), d(v,1))} + 1。
d(u,1) = sum(d(v,2))。
d(u,2)需要枚举当服务器的子结点编号v,然后把其他所有子结点v'的d(v',2)加起来,再和d(v,0)相加。
可以利用已经算出的d(u,1)写出一个新的状态转移方程:d(u,2) = min(d(u,1) – d(v,2) + d(v,0))。
最终答案为min(d(1,0), d(1,2))。
代码:
- #include <cstdio>
- #include <vector>
- using namespace std;
- const int UP = + ;
- int F[UP], d[UP][]; // F[r]为结点r的父结点
- vector<int> seq, edge[UP]; // seq为结点访问顺序序列
- void dfs(int r, int f){
- F[r] = f;
- seq.push_back(r);
- for(int i = ; i < edge[r].size(); i++){
- int b = edge[r][i];
- if(b != f) dfs(b, r);
- }
- }
- int main(){
- int n;
- while(scanf("%d", &n) == ){
- seq.clear();
- for(int i = ; i <= n; i++) edge[i].clear();
- for(int f, b, i = ; i < n; i++){
- scanf("%d%d", &f, &b);
- edge[f].push_back(b);
- edge[b].push_back(f);
- }
- dfs(, -); // 以结点1为根建立有根树
- for(int p = seq.size() - ; p >= ; p--){
- int r = seq[p];
- d[r][] = ; d[r][] = ;
- for(int i = ; i < edge[r].size(); i++){
- int b = edge[r][i];
- if(b == F[r]) continue;
- d[r][] += min(d[b][], d[b][]); // d[r][0]代表r是服务器
- d[r][] += d[b][]; // d[r][1]代表r不是服务器,但其父结点是
- }
- d[r][] = ; //d[r][2]代表r及其父结点都不是服务器
- for(int i = ; i < edge[r].size(); i++){
- int b = edge[r][i];
- if(b == F[r]) continue;
- d[r][] = min(d[r][], d[r][] - d[b][] + d[b][]);
- }
- }
- printf("%d\n", min(d[][], d[][]));
- scanf("%d", &n); // 读取结束标记
- }
- return ;
- }
UVa 1218 - Perfect Service(树形DP)的更多相关文章
- UVA - 1218 Perfect Service(树形dp)
题目链接:id=36043">UVA - 1218 Perfect Service 题意 有n台电脑.互相以无根树的方式连接,现要将当中一部分电脑作为server,且要求每台电脑必须连 ...
- UVA - 1218 Perfect Service (树形dp)(inf相加溢出)
题目链接 题意:给你一个树形图,让你把其中若干个结点染成黑色,其余的染成白色,使得任意一个白色结点都恰好与一个黑色结点相邻. 解法比较容易,和树上的最大独立集类似,取一个结点作为树根,对每个结点分三种 ...
- UVa 1218 - Perfect Service
/*---UVa 1218 - Perfect Service ---首先对状态进行划分: ---dp[u][0]:u是服务器,则u的子节点可以是也可以不是服务器 ---dp[u][1]:u不是服务器 ...
- UVA - 1218 Perfect Service (树形DP)
思路:dp[i][0]表示i是服务器:dp[i][1]表示i不是服务器,但它的父节点是服务器:dp[i][2]表示i和他的父亲都不是服务器. 转移方程: d[u][0] += min(d[ ...
- UVa 1218 Perfect Service 完美的服务
***状态设计值得一看dp[u][0]表示u是服务器(以下v均指任意u的子结点,son指u的所有子结点)ap[u][0]=sum{dp[v][1]}+1//错误,服务器是可以和其他服务器相邻的dp[u ...
- POJ3398Perfect Service[树形DP 树的最大独立集变形]
Perfect Service Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1518 Accepted: 733 De ...
- UVa 10859 - Placing Lampposts 树形DP 难度: 2
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVa 1292 - Strategic game (树形dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题目大意 给定一棵树,选择尽量少的节点,使得每个没有选中的结点至少和一个已选结点相邻. 思路 ...
- Uva LA 3902 - Network 树形DP 难度: 0
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
随机推荐
- Golang教程:goroutine信道
在上一篇教程中,我们讨论了如何使用协程实现并发.在这篇教程中,我们将讨论信道以及如何使用信道实现协程间通信. 什么是信道 信道(Channel)可以被认为是协程之间通信的管道.与水流从管道的一端流向另 ...
- javascript下的arguments,caller,callee,call,apply示例及理解
(参考:http://justcoding.iteye.com/blog/589111) Arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments ...
- Java线程入门第三篇
Java内存模型(jmm) Why:保证多线程正确协同工作 看图说明: 文字解释:线程a和线程b通信过程,首先线程a把本地内存的共享变量更新到主内存中,然后线程b去读取主内存的共享变量,最后更新到自己 ...
- Spring课程 Spring入门篇 7-1 Aspect介绍及PointCut注解应用
本节主要是理论型: 关键看下节实操. 这个其实只要理解一点:使用AspectJ进行Spring AOP 编程,其实就是使用了JAVA注解的风格进行配置和使用. 不像之前讲的那样在配置文件中配置使用.
- 洛谷P2196 挖地雷(dp)
题意 题目链接 Sol 早年NOIP的题锅好多啊.. 这题连有向边还是无向边都没说(害的我wa了一遍) 直接\(f[i]\)表示到第\(i\)个点的贡献 转移的时候枚举从哪个点转移而来 然后我就用一个 ...
- “没有用var声明的为全局变量”这种说法不准确
结论: “没有用var声明的变量为全局变量”这样的说法不太正确,需要在这句话前面加一个前提,如果①变量前面没有用var声明,②在变量所在在的作用域链中没有这个变量名称,则设置该变量为全局变量. 代码 ...
- Python-并发编程(进程)
接下来我们用几天的时间说一说python中并发编程的知识 一.背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作 ...
- Regular Expression学习笔记
正则写法 var re = /a/;//简写 /.../里不能为空,因为会误以为是注释: var re = new RegExp('a'); 新建一个RegExp对象:和新建Array对象,Objec ...
- sqoop简单介绍
一简介 Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS ...
- JavaScript & jQuery Code Snippet
1. 按照每个object的Name属性对object对象集合进行排序: //sort a collection of objects by Name property function sortBy ...