【树形dp】完美的服务UVA1218

7人阅读 评论(0) 收藏 举报
分类:

一道树形dp卡了这么久。。。

题意:一个书中,每个点都可以安服务器,问最少多少服务器可以使每个不是服务器的点恰好只与一个服务器相邻

把每个点分情况讨论

1.自己安服务器 2.自己不安,父节点安,这样所有子节点不能安 3自己不安,父节点不安,这样有且只有一个子节点安

设dp[i][0]为i及其子树,当i安服务器时最少服务器。dp[i][2]表示i的父亲安儿子不安,dp[i][1]表示i的一个儿子安父亲不安

dp[i][0]可以从儿子中0,1转移,dp[i][2]只能从儿子中1转移

只有一个儿子安这种情况看起来麻烦一点,但是可以看成本来所有儿子都不安,这样就等于dp[i][2],然后选出一个儿子变成安,这样会产生一个差值,最后加上所有儿子中最小的差值


然后怒交一发,发现WA??然后xjb改都没有用,然后盯着代码看了半天脑洞一开发现自己INF按照习惯开的两千万,这样叶节点儿子安的情况是INF,但是如果有一个节点连了很多叶节点,转移的时候很有可能会爆INT。码力弱。。。


#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN (20010)
#define INF (210010)
using namespace std;
int n,m1,h[MAXN],dp[MAXN][3];
struct edge{
	int next,to;
	void Add(int Next,int To){
		next=Next; to=To;
	}
}q[MAXN];
void addedge(int x,int y){
	q[++m1].Add(h[x],y); h[x]=m1;
	q[++m1].Add(h[y],x); h[y]=m1;
}
void Dfs(int x,int fa){
	int i,y,k=INF;
	dp[x][0]=1; dp[x][1]=dp[x][2]=0;
	for (i=h[x];i;i=q[i].next){
		y=q[i].to;
		if (y==fa) continue;
		Dfs(y,x);
		dp[x][0]+=min(dp[y][0],dp[y][2]);
		dp[x][2]+=dp[y][1];
		k=min(k,dp[y][0]-dp[y][1]);
	}
	dp[x][1]=dp[x][2]+k;
}
int main(){
	while (cin>>n){
		memset(h,0,sizeof(h));
		memset(q,0,sizeof(q));
		memset(dp,0,sizeof(dp));
		m1=0;
		int x,y;
		for (int i=1;i<=n-1;i++){
			scanf("%d %d",&x,&y);
			addedge(x,y);
		}
		scanf("%d",&x);
		Dfs(1,0);
		printf("%d\n",min(dp[1][0],dp[1][1]));
		if (x==-1) break;
	}
}

查看评论

例题9-14 完美的服务 UVa1218

1.题目描述:点击打开链接 2.解题思路:本题的分析思路类似于上一道例题。还是利用树状dp解决。根据题意,可以定义如下的三种状态值: (1)d(u,0)表示u不是服务器,但u的父亲是服务器(暗含u...
  • u014800748
  • u014800748
  • 2015-02-15 18:37:32
  • 871

[UVa1218]完美服务

A network is composed of N computers connected by N − 1 communication links such that any twocompute...
  • UISG103
  • UISG103
  • 2017-07-19 07:53:49
  • 220

树形DP(完美的服务,uva 1218)

INF不能弄太大,因为会不停地累加很多次,事实上加三次就爆了。INF一直习惯了用0X3F3F3F3F,这不好,特别是DP时状态转移需要累加的情况,应该弄得比可能的上界再大一点点就好了。或者你可以不停地...
  • xl2015190026
  • xl2015190026
  • 2016-09-20 21:31:26
  • 184

1218 - Perfect Service(完美服务)

这是一道经典的树形DP题目,特点是要优化状态 。 仔细思考为什么要将状态定义成紫书上说的那样,因为该题要求每台不是服务器的计算机恰好要和一台服务器计算机相邻,  然而如何由当前节点看出来这点呢? 如果...
  • weizhuwyzc000
  • weizhuwyzc000
  • 2015-07-14 21:44:39
  • 900

树形DP整理小结

树形DP: 在树上进行dp,树是递归的定义的,所以树形dp也是递归的求解,一般而言,dp[node]表示的是以node为根的子树能得到的最优解 一般而言,dp[node]需要从node的子结点进行状态...
  • tomorrowtodie
  • tomorrowtodie
  • 2016-08-24 15:38:21
  • 1132

UVa1218 - Perfect Service(树形dp)

题目链接分析: f[u][0]:u是服务器,u的父亲不是服务器,那么u的儿子可以是服务器,也可以不是 f[u][1]:u不是服务器,但是u的父亲是服务器,那么u的儿子一定不是服务器 f[u][2]:u...
  • wu_tongtong
  • wu_tongtong
  • 2017-11-01 14:59:34
  • 86

树形动态规划(树形DP)入门问题—初探 & 训练

树形DP入门 poj 2342 Anniversary party   先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的...
  • txl16211
  • txl16211
  • 2015-04-29 22:40:03
  • 11025

树形DP例题整理

与普通dp类似,但是状态遍历不能简单的++i,而应该按由儿子到父亲的顺序完成。可以通过DFS递归完成,也可以按DFS(BFS)序从大到小完成,以保证先完成儿子再完成父亲。例题一 皇宫看守 tyvj_...
  • Mr_Poisonous
  • Mr_Poisonous
  • 2017-08-17 17:40:56
  • 142

蓝桥杯 完美的代价

分析: 贪心思想,从左向右bi
  • Houheshuai
  • Houheshuai
  • 2014-11-18 20:51:49
  • 2213

树形 DP 总结

一、介绍 1、什么是树型动态规划  顾名思义,树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有...
  • AngOn823
  • AngOn823
  • 2016-08-27 14:12:16
  • 2102
    个人资料
    持之以恒
    等级:
    访问量: 449
    积分: 306
    排名: 25万+
    文章存档
    最新评论