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)的更多相关文章

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

    题目链接:id=36043">UVA - 1218 Perfect Service 题意 有n台电脑.互相以无根树的方式连接,现要将当中一部分电脑作为server,且要求每台电脑必须连 ...

  2. UVA - 1218 Perfect Service (树形dp)(inf相加溢出)

    题目链接 题意:给你一个树形图,让你把其中若干个结点染成黑色,其余的染成白色,使得任意一个白色结点都恰好与一个黑色结点相邻. 解法比较容易,和树上的最大独立集类似,取一个结点作为树根,对每个结点分三种 ...

  3. POJ3398Perfect Service[树形DP 树的最大独立集变形]

    Perfect Service Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1518   Accepted: 733 De ...

  4. UVA-1220-Party at Hali-Bula && UVA-1218-Perfect Service(树形DP)

    UVA-1220-Party at Hali-Bula 题意: 一个公司员工要举行聚会,要求任意一个人不能和他的直接上司同时到场,一个员工只有一个支系上司,现在求最多有多少人到场,并且方案是否唯一(紫 ...

  5. lightoj 1201 - A Perfect Murder(树形dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1201 题解:简单的树形dp,dp[0][i]表示以i为根结点不傻i的最多有多少 ...

  6. Perfect Service [POJ 3398]

    Perfect Service 描述 网络由N个通过N-1个通信链路连接的计算机组成,使得任何两台计算机可以通过独特的路由进行通信.如果两台计算机之间存在通信链路,则称这两台计算机是相邻的.计算机的邻 ...

  7. POJ 1849 - Two - [DFS][树形DP]

    Time Limit: 1000MS Memory Limit: 30000K Description The city consists of intersections and streets t ...

  8. POJ-3659-最小支配集裸题/树形dp

    Cell Phone Network Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7127   Accepted: 254 ...

  9. UVa 1218 - Perfect Service

    /*---UVa 1218 - Perfect Service ---首先对状态进行划分: ---dp[u][0]:u是服务器,则u的子节点可以是也可以不是服务器 ---dp[u][1]:u不是服务器 ...

随机推荐

  1. SpringMVC注解示例

    1.web.xml <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-cla ...

  2. Linux 基本命令总结

    0.平时自己用的命令 在跑一些程序,例如deep learning的时候,总是希望查看一下cpu.gpu.内存的使用率. (1)cpu.内存情况:使用top命令: (2)查看gpu:使用 nvidia ...

  3. Java_io_02_从一个目录拷贝文件到另一个目录下

    java从一个目录拷贝文件到另一个目录下   http://www.cnblogs.com/langtianya/p/4857524.html ** * 复制单个文件 * @param oldPath ...

  4. sqlserver 新建只读权限用户

    1,新建只能访问某一个表的只读用户. --添加只允许访问指定表的用户:execsp_addlogin'用户名','密码','默认数据库名' --添加到数据库execsp_grantdbaccess'用 ...

  5. python实现无序列表:链表

    介绍链表前我们先了解下什么是列表. 在对基本数据结构的讨论中,我们使用 Python 列表来实现所呈现的抽象数据类型.列表是一个强大但简单的收集机制,为程序员提供了各种各样的操作.然而,不是所有的编程 ...

  6. C++ 播放音频流(PCM裸流)

    直接上代码,如果有需要可以直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用了(注意将声道和频率与你自己的文件对应哦).当然我自己也用VS2008(VS2013好用太多,强烈推荐还是用V ...

  7. 迁移学习-微调(fine-tune)的注意事项:

    选取微调形式的两个重要因素:新数据集的大小(size)和相似性(与预训练的数据集相比).牢记卷积网络在提取特征时,前面的层所提取的更具一般性,后面的层更加具体,更倾向于原始的数据集(more orig ...

  8. bzoj 4823 & 洛谷 P3756 老C的方块 —— 最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4823 https://www.luogu.org/problemnew/show/P3756 ...

  9. flume 配置与使用

    1.下载flume,解压到自建文件夹 2.修改flume-env.sh文件 在文件中添加JAVA_HOME 3.修改flume.conf 文件(原名好像不叫这个,我自己把模板名改了) 里面我自己配的( ...

  10. 【转】 Pro Android学习笔记(四七):Dialog(4):一些补充和思考

    目录(?)[-] 编程思想封装接口 fragment和activity以其他fragment之间的通信 编程思想:封装接口 在小例子中,fragment会调用activity的onDialogDone ...