Perfect service(树形dp)
Perfect service(树形dp)
有n台机器形成树状结构,要求在其中一些机器上安装服务器,使得每台不是服务器的计算机恰好和一台服务器计算机相邻。求服务器的最小数量。n<=10000。
这种类似独立集的树形dp问题,都可以将同一个结点的状态分成几类。这里用\(f[i][0]\)表示i是服务器,\(f[i][1]\)表示i不是服务器,但是i的父亲是服务器。\(f[i][2]\)表示i和i的父亲都不是服务器。
那么就可以写出转移方程:\(f[i][0]=sum(min(f[v][0], f[v][1]))+1\),\(f[i][1]=sum(f[v][2])\),\(f[i][2]=min(f[i][1]-f[v][2]+f[v][0])\)。时间复杂度为\(O(n)\)。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e4+5;
int cntedge, fir[maxn];
struct Edge{
int to, next;
}e[maxn];
void RESET(){ cntedge=0; memset(fir, 0, sizeof(fir)); }
void addedge(int x, int y){
Edge &e1=e[++cntedge];
e1.to=y; e1.next=fir[x]; fir[x]=cntedge;
}
int n, f[maxn][3]; //0:自己是 1:父亲是 2:自己和父亲都不是
\
//也可以保存访问顺序,在外部访问
void dfs(int u, int par){
f[u][0]=1; f[u][1]=0;
f[u][2]=n; int v;
for (int i=fir[u]; i; i=e[i].next){
if ((v=e[i].to)==par) continue;
dfs(v, u);
f[u][0]+=min(f[v][0], f[v][1]);
f[u][1]+=f[v][2];
}
for (int i=fir[u]; i; i=e[i].next){
if ((v=e[i].to)==par) continue;
f[u][2]=min(f[u][2], f[u][1]-f[v][2]+f[v][0]);
}
}
int main(){
int t1=0, t2;
while (~t1&&~scanf("%d", &n)){
RESET();
for (int i=1; i<n; ++i){
scanf("%d%d", &t1, &t2);
addedge(t1, t2); addedge(t2, t1); }
dfs(1, 0);
printf("%d\n", min(min(f[1][0], f[1][1]), f[1][2]));
scanf("%d", &t1);
}
return 0;
}
Perfect service(树形dp)的更多相关文章
- UVA - 1218 Perfect Service(树形dp)
题目链接:id=36043">UVA - 1218 Perfect Service 题意 有n台电脑.互相以无根树的方式连接,现要将当中一部分电脑作为server,且要求每台电脑必须连 ...
- UVA - 1218 Perfect Service (树形dp)(inf相加溢出)
题目链接 题意:给你一个树形图,让你把其中若干个结点染成黑色,其余的染成白色,使得任意一个白色结点都恰好与一个黑色结点相邻. 解法比较容易,和树上的最大独立集类似,取一个结点作为树根,对每个结点分三种 ...
- POJ3398Perfect Service[树形DP 树的最大独立集变形]
Perfect Service Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1518 Accepted: 733 De ...
- UVA-1220-Party at Hali-Bula && UVA-1218-Perfect Service(树形DP)
UVA-1220-Party at Hali-Bula 题意: 一个公司员工要举行聚会,要求任意一个人不能和他的直接上司同时到场,一个员工只有一个支系上司,现在求最多有多少人到场,并且方案是否唯一(紫 ...
- lightoj 1201 - A Perfect Murder(树形dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1201 题解:简单的树形dp,dp[0][i]表示以i为根结点不傻i的最多有多少 ...
- Perfect Service [POJ 3398]
Perfect Service 描述 网络由N个通过N-1个通信链路连接的计算机组成,使得任何两台计算机可以通过独特的路由进行通信.如果两台计算机之间存在通信链路,则称这两台计算机是相邻的.计算机的邻 ...
- POJ 1849 - Two - [DFS][树形DP]
Time Limit: 1000MS Memory Limit: 30000K Description The city consists of intersections and streets t ...
- POJ-3659-最小支配集裸题/树形dp
Cell Phone Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7127 Accepted: 254 ...
- UVa 1218 - Perfect Service
/*---UVa 1218 - Perfect Service ---首先对状态进行划分: ---dp[u][0]:u是服务器,则u的子节点可以是也可以不是服务器 ---dp[u][1]:u不是服务器 ...
随机推荐
- Java的反射机制(应用篇)
Java的的反射机制,是一个很难但却比较有用的概念.反射机制经常出现在框架设计中,大神说:反射是框架设计的灵魂,也就是说要想看懂框架的源代码,必须得掌握反射机制. 作为初学者的我,觉得至少应该掌握它日 ...
- leetcode 201. Bitwise AND of Numbers Range(位运算,dp)
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...
- 将session存入数据库,memcache的方法
//存入数据库 <?phpif(!$con = mysql_connect('localhost','root','123456')){ die('连接数据库失败');}$link = m ...
- Angular Chart 使用说明(基于angular工程)
Angular Chart是基于Chart.js的angular组件,引入项目后直接操作数据即可. 引用方法: 分别将Chart.js.angular-chart.js.angular-char ...
- Parallel Programming-Parallel.Invoke
本文主要介绍Parallel.Invoke的使用. 一.使用例子 class ParallelInvoke { public void Action1() { Thread.Sleep(); Cons ...
- MFC中如何不使用Unicode字符集
命令窗口:调试->属性-> 把字符集设置为:未设置
- electron将网站打包成桌面应用
需求同 NW.js将网站打包成桌面应用 1. 从github上克隆electron示例项目 git clone https://github.com/electron/electron-quick-s ...
- python 基础 进程与线程
多进程 使用multipprocessing模块创建多进程 multiprocessing模块提供了一个Process类来描述一个进程对象.创建子进程时,需要传入一个执行函数和函数的参数.用start ...
- Mysql ExcuteNonQuery
ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对于 Update,Insert,Delete 语句 执 ...
- JAVA基础知识总结3(面向对象)
特点:过程其实就是函数:对象是将函数等一些内容进行了封装 1:将复杂的事情简单化. 2:面向对象将以前的过程中的执行者,变成了指挥者. 3:面向对象这种思想是符合现在人们思考习惯的一种思想. 匿名对象 ...