题目链接

一共有三种状态: 
1、d[u][0]:u是服务器,每个子结点可以是也可以不是。 
2、d[u][1]:u不是服务器,但u的父亲是,u的子结点都不是服务器。 
3、d[u][2]:u和u的父亲都不是服务器,u的子结点恰有一个是服务器。 
三种状态的转移:

d[u][0]=∑min(d[v][0],d[v][1])+1
d[u][1]=∑d[v][2]
d[u][2]=min(d[u][1]−d[v][2]+d[v][0])
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 1e4+5;
 5 const int INF = 1e9;
 6
 7 vector<int> G[maxn],vertices;
 8 int p[maxn],d[maxn][3];
 9
10 void dfs(int u,int fa){
11     vertices.push_back(u);
12     p[u] = fa;
13     for(int i=0; i<G[u].size(); i++){
14         int v = G[u][i];
15         if(v!=fa) dfs(v,u);
16     }
17 }
18
19 int main(){
20     int n;
21     while(scanf("%d",&n)==1){
22         for(int i=0; i<n; i++) G[i].clear();
23         for(int i=0; i<n-1; i++){
24             int u,v;
25             scanf("%d%d",&u,&v); u--,v--;
26             G[u].push_back(v);
27             G[v].push_back(u);
28         }
29         vertices.clear();
30         dfs(0,-1);
31
32         for(int i=vertices.size()-1; i>=0; i--){
33             int u = vertices[i];
34             d[u][0] = 1; d[u][1] = 0;
35             for(int i=0; i<G[u].size(); i++){
36                 int v = G[u][i];
37                 if(v==p[u]) continue;
38                 d[u][0] += min(d[v][0],d[v][1]);
39                 d[u][1] += d[v][2];
40                 if(d[u][0]>INF) d[u][0] = INF;
41                 if(d[u][1]>INF) d[u][1] = INF;
42             }
43
44             d[u][2] = INF;
45             for(int i=0; i<G[u].size(); i++){
46                 int v = G[u][i];
47                 if(v==p[u]) continue;
48                 d[u][2] = min(d[u][2],d[u][1]-d[v][2]+d[v][0]);
49             }
50         }
51
52         printf("%d\n",min(d[0][0],d[0][2]));
53         scanf("%d",&n);
54     }
55
56 }

转载于:https://www.cnblogs.com/yxg123123/p/6827742.html

dp uva1218相关推荐

  1. [UVA-1218] Perfect Service(树的最小支配集)

    题目链接:https://vjudge.net/problem/UVA-1218 题目大意:给你一棵无向树,让你求树的最小支配集,但是有一个要求是除最小支配集外剩下的任何一个结点不能同时连接支配集中的 ...

  2. [51nod1299]监狱逃离 树形DP || 20w个点的网络流最小割ORZ

    监狱有N条道路连接N + 1个交点,编号0至N,整个监狱被这些道路连在一起(任何2点之间都有道路),人们通过道路在交点之间走来走去.其中的一些交点只有一条路连接,这些点是监狱的出口.在各个交点中有M个 ...

  3. dp,sp,px相互转化

    方法一: public int sp2px(float sp) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, ...

  4. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  5. HDU 2084 数塔(DP)(JAVA版)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  6. dp cf 20190615

    A. Timofey and a tree 这个不算是dp,就是一个思维题,好难想的思维题,看了题解才写出来的, 把点和边分开,如果一条边的两个点颜色不同就是特殊边,特殊边两边连的点就叫特殊点, 如果 ...

  7. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)

    Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MB Submit ...

  8. [NOI2005]聪聪与可可(期望dp)

    题意:给一张无向图,有一只猫和一只老鼠,猫每秒会向老鼠的方向移动两个单位,若它们的距离为一,那么只会移动一个单位,老鼠会等概率向周围移动一步或不动,求猫抓到老鼠的期望时间. Solution luog ...

  9. Codeforces 903F Clear The Matrix(状态压缩DP)

    题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...

最新文章

  1. linux双机脚本pkg如何生效,linux里命令pkg config工具的使用
  2. 通信upf是什么意思_5G给边缘计算带来了什么?
  3. 交互输入与for语句
  4. 【Paper】2012_Design of high performance multimedia control system for UAV/UGV based on SoC/FPGA Core
  5. 剑指Offer - 面试题3. 数组中重复的数字(哈希)
  6. SAGAN生成更为精细的人脸图像(tensorflow实现)
  7. 云端远程Ubuntu系统进行无桌面Web浏览器自动化测试
  8. Seesion工作原理
  9. jsf UIComponent组件接口详细注释说明(jsf1.1规范)
  10. Cassandra 数据模型
  11. 2022年全球差旅费管理系统行业分析报告
  12. sockscap+Bitvise Tunnelier 做内网渗透
  13. 豆丁网免费下载软件(冰点非常好用)
  14. python 股票历史数据相关性 监测绘图
  15. List总结(LinkedList, ArrayList等使用场景和性能分析) [From skywang12345 ]
  16. 自制 12306 抢票工具 5秒内完成订票
  17. 商业谈判在中国:西方人的见解
  18. 基于Idea的Spark大数据分析--scala
  19. 满功耗RTX 4060首选游戏本:华硕天选4新品开售
  20. 李宏毅机器学习—读书笔记

热门文章

  1. Android中的HTTP通信
  2. C#自定义控件四简易时钟
  3. 如何通过五个简单步骤成为更好的Stack Overflow用户
  4. dhcp动态主机配置协议
  5. Spark的基础应用
  6. 关于springboot vue前后端分离项目部署到阿里云轻量服务器(前后端分开部署)
  7. win10如何查看NVIDIA驱动的版本
  8. 使用计算机辐射最大,计算机辐射的主要来源及其对人体的危害
  9. Java GC 日志解析
  10. 微信小程序把玩(三十五)Video API