题目大意:

给一棵树,在树上选点安装服务器,要求每个非服务器的点有且仅有一个服务器与之相连,求服务器的最少数量

树上的动态规划,仍然按照每个节点的情况分类:

1.f[u][0]表示u是服务器,那么每个子节点可以是也可以不是

2.f[u][1]表示u不是服务器,而u的父亲是服务器,则u的所有子节点都不是服务器

3.f[u][2]表示u和父亲都不是服务器,则u恰好有一个儿子是服务器

那么可以得到以下转移方程:(v代表u的所有字节点)

f[u][0]=sum{min(f[v][1],f[v][0])}+1

f[u][1]=sum{f[v][2]}

f[u][2]较为复杂,我们需要枚举每一个v,选它的f[v][0],然后加上其他儿子节点的f[v][2],不过由于f[u][1]求出了sum{f[v][2]},我们可以利用f[u][1]来写状态转移方程:f[u][2]=min(f[u][1]-f[v][2]+f[v][1])

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=1e4+5;
const int inf=1e4+5;
int f[maxn][5],n,x,y;
struct Edge{int from,to;Edge(int from,int to):from(from),to(to){}
};
vector<Edge>edges;
vector<int>G[maxn];
void clear(){for(int i=1;i<maxn;i++)G[i].clear();edges.clear();memset(f,0,sizeof(f));
}
void addedge(int from,int to){edges.push_back((Edge){from,to});G[from].push_back(edges.size()-1);
}
void dfs(int u,int fa){if(G[u].size()==1&&edges[G[u][0]].to==fa){f[u][0]=1;f[u][1]=0;f[u][2]=inf;//对叶子节点赋初值return ;}f[u][2]=inf;for(int i=0;i<G[u].size();i++){int e=G[u][i];int v=edges[e].to;if(v==fa)continue;dfs(v,u);f[u][0]+=min(f[v][0],f[v][1]);f[u][1]+=f[v][2];f[u][2]=min(f[u][2],f[u][1]-f[v][2]+f[v][0]);}f[u][0]++;
}
int main(){while(scanf("%d",&n)==1){if(n==-1)return 0;if(n==0)scanf("%d",&n);clear();for(int i=1;i<n;i++){scanf("%d%d",&x,&y);addedge(x,y);addedge(y,x);}dfs(1,0);printf("%d\n",min(f[1][0],f[1][2]));}
}

UVA 1218 完美的服务相关推荐

  1. uva 1218 Perfect Service 树形dp

    // uva 1218 Perfect Service 树形dp // // 解题思路: // // d[u][0]表示节点本身是服务器 // d[u][1]表示节点的父节点是服务器 // d[u][ ...

  2. UVA - 1218 Perfect Service(树形dp)

    题目链接:UVA - 1218 Perfect Service 题意 有n台电脑,互相以无根树的方式连接,现要将其中一部分电脑作为服务器,且要求每台电脑必须连接且只能连接一台服务器(不包括作为服务器的 ...

  3. uva 1218——Perfect Service

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

  4. UVa1218完美的服务

    题意: 思路: 注意: d[u][2]不能设为真的无穷大,因为涉及累加,会溢出.应该设一个它可能取到的最大值n. 然后就是,刚开始用vis数组标记,模拟dfs来遍历树,发现不行,因为在求d[u][2] ...

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

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

  6. React 服务端渲染方案完美的解决方案

    最近在开发一个服务端渲染工具,通过一篇小文大致介绍下服务端渲染,和服务端渲染的方式方法.在此文后面有两中服务端渲染方式的构思,根据你对服务端渲染的利弊权衡,你会选择哪一种服务端渲染方式呢? 什么是服务 ...

  7. 自助餐比喻秒懂微服务

    将整个微服务大部分核心内容,使用自助餐(亚马逊烤肉)全套服务比喻,一下就能秒懂,不信你往下看: 亚马逊为了确保服务的质量,也是做足了准备.三名"大堂"主管,戴着专业的蓝牙耳机在有条 ...

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

    " 这里描述我们实际服务部署的时候频繁发生的两个常用场景. 第一个场景,我们"办公网环境"想要在"准生产环境"下部署,需要做如下工作: 打包.将文件上 ...

  9. 关于游戏服务端的搭建

      前一阵,一场突如其来的疫情,将我们都困在了家中,于是有了大把的时间,来做一些自己感兴趣的事情.当然,是打游戏咯.   不过只是打游戏,也太low了,完全不符合我们程序员的气质,我们作为网络世界中的 ...

最新文章

  1. linux maps,linux下/proc/pid/maps和pmap命令详解
  2. python学习札记20210123
  3. 思路,如何快速应对客户提出的业务需求
  4. C#中base64编码与解码
  5. HDU 2152 选课时间(题目已修改,注意读题) (母函数)
  6. linux 动态库建立,浅析linux下静态库和动态库的建立和使用
  7. 岁月悄然前行,没有停留的痕迹
  8. Java进程CPU占用高导致的网页请求超时的故障排查
  9. 用python处理excel表格_使用Python处理excel表格(openpyxl)及表格中的中文处理
  10. Paip. DDBS 分布式 数据库系统 attilax总结C0G
  11. 效率源希捷硬盘修复(4.2版)及程序下载
  12. 设计模式——单例模式八种方式实现与分析(附代码示例)
  13. json改键值大法,C# Newtonsoft.Json.Linq改字段名 增删改查 有屋设计拆单管理一体化软件 全屋定制拆单 橱柜衣柜设计拆单 整装 木门归方程序
  14. vscode插件(安装路径),压缩js文件解压,方便查看
  15. 在官网下载linux版本的tomcat
  16. pandas——显示设置
  17. 2023年中央民族大学新闻学保研必看上岸前辈复习经验分享
  18. 516. Longest Palindromic Subsequence
  19. SD卡、记忆棒等内存卡的数据恢复方法
  20. Android 虚拟按键与沉浸式的适配

热门文章

  1. AHB与VPB的区别
  2. 远程访问服务器Jupyter Notebook的两种方法
  3. R语言高维数据的pca、 t-SNE算法降维与可视化分析案例报告
  4. 用宅购节当前哨战,京东到家为双十一暗中蓄力
  5. 如何携号转网只需三步
  6. pg_hba.conf 中 md5 和 scram-sha-256 的区别
  7. 服务器出错的原因有哪些
  8. 计算机发展历史及其前景展望,论计算机发展史及展望
  9. 微信小程序约课_基于微信小程序的瑜伽馆约课系统设计
  10. 如何用css弄个七彩,CSS实现文字七彩呼吸灯动画