UVa 1218 完美的服务

https://vjudge.net/problem/UVA-1218

题意:

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

思路:

和紫书上前面的UVa1220挺像的,不过这题是一棵无根树,就把0当做根就行了,方法还是一样的dfs。

d[u][0]:u是服务器,则每个子结点可以是服务器也可以不是。

d[u][1]:u不是服务器,但u的父亲是服务器,这意味着u的所有子结点都不是服务器。

d[u][2]:u和u的父亲都不是服务器。这意味着u恰好有一个儿子是服务器。

状态转移方程分析:

d[u][0]:由于它已经是服务器了,所以子结点可以是也可以不是,选择小的,d[u][1]=sum{min(d[v][0],d[v][1])}+1。1代表它自身这个服务器。

d[u][1]:u的父亲是服务器,那么与它相连的就不可能是服务器了,此时很简单,d[u][1]=sum(d[v][2])

d[u][2]:子结点有且仅有一个服务器,也就是说d[u][2]=min(d[u][2],d[v1][2]+d[v2][2].....+d[v][0])。由于前面已经算出了所有子结点的d[v][2]和,所以这里可以简化为d[u][2]=min(d[u][2],d[u][1]-d[v][2]+d[v][0])

 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 #include<vector>
 5 #include<algorithm>
 6 using namespace std;
 7
 8 const int maxn = 10000 + 5;
 9
10 int n, cnt;
11
12 vector<int> sons[maxn];
13
14 int d[maxn][3];
15
16 void dfs(int u,int fa)
17 {
18     d[u][0] = 1;   //加上自身为服务器
19     d[u][1] = 0;
20     d[u][2] = maxn;
21     int k = sons[u].size();
22     if (k == 1 && fa != 0)  return; //树的叶子节点
23     for (int i = 0; i < k; i++)
24     {
25         int son = sons[u][i];
26         if (fa == son) continue;
27         dfs(son,u);
28         d[u][0] += min(d[son][0], d[son][1]);
29         d[u][1] += d[son][2];
30     }
31     for (int i = 0; i < k; i++)
32     {
33         int son = sons[u][i];
34         if (son == fa)  continue;
35         d[u][2] = min(d[u][2], d[u][1] - d[son][2] + d[son][0]);
36     }
37 }
38
39 int main()
40 {
41     //freopen("D:\\txt.txt", "r", stdin);
42     int a, b;
43     while (cin >> n)
44     {
45         for (int i = 1; i <= n; i++)
46             sons[i].clear();
47         for (int i = 1; i < n; i++)
48         {
49             cin >> a >> b;
50             sons[a].push_back(b);
51             sons[b].push_back(a);
52         }
53         dfs(1,0);
54         cout << min(d[1][0], d[1][2]) << endl;
55         cin >> a;
56         if (a == -1)  break;
57     }
58     return 0;
59 }
时间: 2024-10-12 13:27:40

UVa 1218 完美的服务的相关文章

UVA - 1218 Perfect Service(树形dp)

题目链接:id=36043">UVA - 1218 Perfect Service 题意 有n台电脑.互相以无根树的方式连接,现要将当中一部分电脑作为server,且要求每台电脑必须连接且仅仅能连接一台server(不包含作为server的电脑).求最少须要多少台电脑作为server. 思路 典型的树形dp问题,那么我们来建立模型. d(u,0):u是server,孩子是不是server均可 d(u,1):u不是server,u的父亲是server,u的孩子不能是server d(u,2)

Perfect Service UVA - 1218(树形dp)

Perfect Service UVA - 1218 题意:安装服务器,使得不是服务器的计算机恰好和一台服务器计算机相连.问最少安多少服务器计算机. 之前一直不理解第三个转移方程,,今天再看竟然是错的!!可是却过了!! 下面的是改过的了. 1 #include <cstdio> 2 #include <bits/stdc++.h> 3 using namespace std; 4 const int maxn=10010; 5 int d[maxn][3]; 6 int in[ma

使用Httpclient 完美解决服务端跨域问题

项目需求: jsonp是从前台js的角度考虑,通过Ajax调用springMVC的接口.同一个ip.同一个网络协议.同一个端口,三者都满足就是同一个域,否则就是跨域问题了.首页广告需要一个轮播的效果,取后台数据json格式.上篇博客介绍了使用jsonp来解决跨域,现在有个新的方法来解决,那就是:ajax请求地址改为自己系统的后台地址,之后在自己的后台用HttpClient请求url.封装好的跨域请求url工具类.封装一个get一个POST即可. 两者的区别就在于,jsonp是基于客户端的跨域解决

例题9-14 完美的服务 UVa1218

1.题目描述:点击打开链接 2.解题思路:本题的分析思路类似于上一道例题.还是利用树状dp解决.根据题意,可以定义如下的三种状态值: (1)d(u,0)表示u不是服务器,但u的父亲是服务器(暗含u的所有子结点都不是服务器):(2)d(u,1)表示u是服务器,子结点可以是也可以不是:(3)d(u,2)表示u,u的父亲都不是服务器(暗含u的其中一个子结点是服务器): 定义了这样的三个状态之后,状态转移方程便不难得出: (1) d(u,0)=sum{d(v,2)}(v是u的子结点); (2) d(u,

POJ 3398 / UVA 1218 Perfect Service 树形DP

树形DP Perfect Service Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1378   Accepted: 668 Description A network is composed of N computers connected by N ? 1 communication links such that any two computers can be communicated via a uniqu

面向海量服务的设计原则和策略总结

原文:http://ayufox.iteye.com/blog/676416 互联网服务的特点就是面向海量级的用户,面向海量级的用户如何提供稳定的服务呢?这里,对这几年的一些经验积累和平时接触的一些理念做一个总结.       一.原则       1.Web服务的CAP原理       CAP指的是三个要素:一致性(Consistency).可用性(Availability).分区容忍性(Partition tolerance).CAP原理指的是这三个要素最多只能同时实现两点,不可能三者兼顾,

搜狗语音云开发入门(二)——使用离线语音识别服务

1 简介 之前在<搜狗语音云开发入门--移动端轻松添加高大上的语音识别>中介绍了使用搜狗语音云为客户端程序添加在线语音识别服务.在线语音服务需要联网使用,但是你不能指望用户拥有完美的环境,事实上大多数情况下用户的外围环境都会有所限制.有的时候没有Wi-Fi.没有流量,还想使用语音识别,如果你给用户一个提示"您没开流量..."只能说你的程序弱爆了.有条件情况下给用户提供完美的服务,没有条件创造条件服务质量依然完美,并且清风徐来了无痕迹,这才是完美应用的体现.你不是用户的亲戚朋

开发者说:如何使用插件降低上传文件部署服务的复杂度

“ 这里描述我们实际服务部署的时候频繁发生的两个常用场景. 第一个场景,我们“办公网环境”想要在“准生产环境”下部署,需要做如下工作:打包.将文件上传到堡垒机上.scp将上传好的包裹传输到“准生产环境”的目标机器.ssh 目标机器.restart重启服务. 第二个场景是,我们可能随时的给“准生产环境”临时上传一些文件,但是仍然需要大量频繁操作. 直到前段时间我看了朋友圈一篇“阿里程序员推荐的15 款常用开发者工具”里面提到 Cloud Toolkit 这个工具,试过后觉得它太好用了,完美降低服务

树形dp

树形dp,意思就是在树上的dp, 看了看紫书,讲了三个大点把,一个是树的最大独立集,另外一个是树的重心,最后一个是树的最长路径.给的三个例题,下面就从例题说起 第一个:工人的请愿书 uva 12186 这个题目给定一个公司的树状结构,每个员工都有唯一的一个直属上司,老板编号为0,员工1-n,只有下一级的工人请愿书不小于T%时,这个中级员工,才会签字传递给它的直属上司,问老板收到请愿书至少需要多少各个工人签字 用dp(u)表示u给上级发信至少需要多少工人,那么可以假设u有k个节点,所以需要c =