UVA 1218 完美的服务
题目大意:
给一棵树,在树上选点安装服务器,要求每个非服务器的点有且仅有一个服务器与之相连,求服务器的最少数量
树上的动态规划,仍然按照每个节点的情况分类:
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 完美的服务相关推荐
- uva 1218 Perfect Service 树形dp
// uva 1218 Perfect Service 树形dp // // 解题思路: // // d[u][0]表示节点本身是服务器 // d[u][1]表示节点的父节点是服务器 // d[u][ ...
- UVA - 1218 Perfect Service(树形dp)
题目链接:UVA - 1218 Perfect Service 题意 有n台电脑,互相以无根树的方式连接,现要将其中一部分电脑作为服务器,且要求每台电脑必须连接且只能连接一台服务器(不包括作为服务器的 ...
- uva 1218——Perfect Service
题意:有n个机器组成的树形结构,要求一台服务器必须连接一台电脑,求使用的最少的服务器.. 思路: 树形DP,和前面的有道题目类似.在dfs遍历树的时候找到选当前结点和不选当前节点的最大状态,多一个两个 ...
- UVa1218完美的服务
题意: 思路: 注意: d[u][2]不能设为真的无穷大,因为涉及累加,会溢出.应该设一个它可能取到的最大值n. 然后就是,刚开始用vis数组标记,模拟dfs来遍历树,发现不行,因为在求d[u][2] ...
- [树形DP | Uva 1218]Perfect Service
dp[i][0]表示以i为根的且i被选为服务器的最小服务器数 dp[i][1]表示以i为根且i不被选为服务器,而i父亲为服务器的最小服务器数 dp[i][2]表示以i为根且i不被选为服务器,而i父亲也 ...
- React 服务端渲染方案完美的解决方案
最近在开发一个服务端渲染工具,通过一篇小文大致介绍下服务端渲染,和服务端渲染的方式方法.在此文后面有两中服务端渲染方式的构思,根据你对服务端渲染的利弊权衡,你会选择哪一种服务端渲染方式呢? 什么是服务 ...
- 自助餐比喻秒懂微服务
将整个微服务大部分核心内容,使用自助餐(亚马逊烤肉)全套服务比喻,一下就能秒懂,不信你往下看: 亚马逊为了确保服务的质量,也是做足了准备.三名"大堂"主管,戴着专业的蓝牙耳机在有条 ...
- 开发者说:如何使用插件降低上传文件部署服务的复杂度
" 这里描述我们实际服务部署的时候频繁发生的两个常用场景. 第一个场景,我们"办公网环境"想要在"准生产环境"下部署,需要做如下工作: 打包.将文件上 ...
- 关于游戏服务端的搭建
前一阵,一场突如其来的疫情,将我们都困在了家中,于是有了大把的时间,来做一些自己感兴趣的事情.当然,是打游戏咯. 不过只是打游戏,也太low了,完全不符合我们程序员的气质,我们作为网络世界中的 ...
最新文章
- linux maps,linux下/proc/pid/maps和pmap命令详解
- python学习札记20210123
- 思路,如何快速应对客户提出的业务需求
- C#中base64编码与解码
- HDU 2152 选课时间(题目已修改,注意读题) (母函数)
- linux 动态库建立,浅析linux下静态库和动态库的建立和使用
- 岁月悄然前行,没有停留的痕迹
- Java进程CPU占用高导致的网页请求超时的故障排查
- 用python处理excel表格_使用Python处理excel表格(openpyxl)及表格中的中文处理
- Paip. DDBS 分布式 数据库系统 attilax总结C0G
- 效率源希捷硬盘修复(4.2版)及程序下载
- 设计模式——单例模式八种方式实现与分析(附代码示例)
- json改键值大法,C# Newtonsoft.Json.Linq改字段名 增删改查 有屋设计拆单管理一体化软件 全屋定制拆单 橱柜衣柜设计拆单 整装 木门归方程序
- vscode插件(安装路径),压缩js文件解压,方便查看
- 在官网下载linux版本的tomcat
- pandas——显示设置
- 2023年中央民族大学新闻学保研必看上岸前辈复习经验分享
- 516. Longest Palindromic Subsequence
- SD卡、记忆棒等内存卡的数据恢复方法
- Android 虚拟按键与沉浸式的适配