【题解】UVA1218 Perfect Service
UVA1218:https://www.luogu.org/problemnew/show/UVA1218
刷紫书DP题ing
思路
参考lrj紫书 不喜勿喷
- d(u,0):u是服务器,孩子是不是服务器均可
- d(u,1):u不是服务器,u的父亲是服务器,u的孩子不能是服务器
- d(u,2):u不是服务器且u的父亲不是服务器,u的孩子必须有且仅有一个是服务器。
前两个状态方程好写
那么d(u,2)呢?
d(u,2)就会等于 他儿子全都不是 减去某个不是 再加上某个是 这是这道树形DP的难点
因此 状态方程:d(u,2) = Min(d(u,1)-d(v,2)+d(v,0)) |v是u的孩子
详细解释见代码~
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
#define maxn 10010
vector<int> sons[maxn];
int dp[maxn][3];
int n;
void search(int u,int father)
{
dp[u][0]=1;//本身算一个
dp[u][1]=0;
dp[u][2]=maxn;//要查找 先定义成最大
for(int i=0;i<sons[u].size();i++)
{
if(sons[u][i]!=father)//如果不是父亲 就是儿子
{
search(sons[u][i],u);//递归查找
dp[u][0]+=min(dp[sons[u][i]][0],dp[sons[u][i]][1]);//如果他是 儿子可以是或者不是
dp[u][1]+=dp[sons[u][i]][2];//如果他不是 但他父亲是 儿子都不是
}
}
for(int i=0;i<sons[u].size();i++)
{
if(sons[u][i]!=father)
dp[u][2]=min(dp[u][1]-dp[sons[u][i]][2]+dp[sons[u][i]][0],dp[u][2]);
//如果他不是 他父亲也不是 那么就是他儿子全都不是减去某个不是再加上某个是
}
}
int main()
{
while(scanf("%d",&n)==1)
{
int x,y;
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);//存边
sons[x].push_back(y);
sons[y].push_back(x);
}
search(1,-1);
printf("%d\n",min(dp[1][0],dp[1][2]));//答案在第一个是服务器
//或者第一个不是但是儿子之一是
scanf("%d",&x);//数据结束
if(x==-1)
break;
for(int i=1;i<=n;i++)//初始化
sons[i].clear();
memset(dp,0,sizeof(dp));
}
}
【题解】UVA1218 Perfect Service的更多相关文章
- UVA1218 Perfect Service
Time Limit: 3000MS 64bit IO Format: %lld & %llu /*by SilverN*/ #include<iostream> #inc ...
- POJ 3398 Perfect Service(树型动态规划,最小支配集)
POJ 3398 Perfect Service(树型动态规划,最小支配集) Description A network is composed of N computers connected by ...
- Perfect Service [POJ 3398]
Perfect Service 描述 网络由N个通过N-1个通信链路连接的计算机组成,使得任何两台计算机可以通过独特的路由进行通信.如果两台计算机之间存在通信链路,则称这两台计算机是相邻的.计算机的邻 ...
- UVA - 1218 Perfect Service(树形dp)
题目链接:id=36043">UVA - 1218 Perfect Service 题意 有n台电脑.互相以无根树的方式连接,现要将当中一部分电脑作为server,且要求每台电脑必须连 ...
- UVa 1218 - Perfect Service
/*---UVa 1218 - Perfect Service ---首先对状态进行划分: ---dp[u][0]:u是服务器,则u的子节点可以是也可以不是服务器 ---dp[u][1]:u不是服务器 ...
- Perfect service(树形dp)
Perfect service(树形dp) 有n台机器形成树状结构,要求在其中一些机器上安装服务器,使得每台不是服务器的计算机恰好和一台服务器计算机相邻.求服务器的最小数量.n<=10000. ...
- POJ 3398 Perfect Service --最小支配集
题目链接:http://poj.org/problem?id=3398 这题可以用两种上述讲的两种算法解:http://www.cnblogs.com/whatbeg/p/3776612.html 第 ...
- 【POJ】3398 Perfect Service
1. 题目描述某树形网络由$n, n \in [1, 10^4]$台计算机组成.现从中选择一些计算机作为服务器,使得每当普通计算机恰好与一台服务器连接(并且不超过一台).求需要指定服务器的最少数量 2 ...
- Perfect Service
题意: n个节点树,在一个节点放上一台服务器可以给相邻的其他各点提供服务且一个节点只能接受一台服务器,求使n个节点都被服务放的服务器的最小数量. 分析: 不算太难,状态想的差不多,但是考虑不全面状态方 ...
随机推荐
- 程序包com.sun.image.codec.jpeg不存在
在pox.xml中引入依赖 <dependency><groupId>rt</groupId><artifactId>rt</artifactId ...
- 【卷土重来之C#学习笔记】(一)c#文章导航目录
[卷土重来之C#学习笔记](一)c#文章导航目录 [卷土重来之C#学习笔记](二)c#编程概述 [卷土重来之C#学习笔记](三)类型.存储.对象 [卷土重来之C#学习笔记](四)类的基本概念 [卷土重 ...
- 码农的好助手:版本管理工具git的使用
一.什么是github? GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub. GitHub 于 2008 年 4 月 10 日 ...
- [LeetCode]21. Merge Two Sorted Lists合并两个有序链表
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- vue+rest-framework前后端分离整合
一.vue部分 二.django路由配置 (1)项目urls.py修改如下: from django.conf.urls import url, include urlpatterns = [ # p ...
- 【代码笔记】Java深入学习——实现客户端发送文件到服务器的文件传输
Server.java package com.huaxin.lesson02; import java.io.FileOutputStream; import java.io.InputStream ...
- 关于React的生命周期的解释
---恢复内容开始--- ---恢复内容结束---
- JQuery和html+css实现鼠标点击放烟花
<!DOCTYPE html> <html> <head><meta http-equiv="Content-Type" content= ...
- Android 解决Glide 加载图片缓慢(第一次加载不出来图片)的Bug
- matlab练习程序(Ritter‘s最小包围圆)
原始算法是sphere,我这里简化为circle了. Ritter's求最小包围圆为线性算法,因为非常简单,所以应用非常广泛. 该算法求出的圆比最优圆大概会大个5%到20%左右,求最优圆应该可以用Bo ...