ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P2899 [USACO08JAN]Cell Phone Network G

2022-03-27 11:33:29  阅读:148  来源: 互联网

标签:USACO08JAN 点亮 int 自己 儿子 Cell Phone dp define



这是一个很经典的树形dp
其实还是很有难度的
dp[u][0]表示u节点一定被自己点亮
dp[u][1]表示u节点一定被父亲点亮
dp[u][2]表示u节点一定被儿子点亮

注意这里的“一定”表示:
比如dp[u][1]表示一定u的父亲是亮的,但是不排除u是亮的或者u的儿子是亮的

尽管这里有个状态是dp[u][1]被父亲点亮,但是我们任就从下往上进行转移,是不影响的

被自己点亮,儿子三种情况都可行的
dp[u][0]+=min(dp[v][1],dp[v][0],dp[v][2])

被父亲点亮,那儿子可以是自己亮或者被儿子的儿子点亮
dp[u][1]+=min(dp[v][0],dp[v][2])

被儿子点亮,这种情况是最麻烦的
首先我们一定要满足一个儿子是被自己点亮的,再其次剩下的儿子可以选择自己亮或者被自己儿子点亮
转移过程:
先假设每个儿子都自己亮,再维护一个数组(儿子的儿子亮-儿子自己亮)
从小到大进行排序
如果
儿子的儿子亮-儿子自己亮<0 也就是 儿子的儿子亮<儿子自己亮,更新dp[u][1],就是让原来儿子自己亮着的状态换成儿子的儿子亮着的状态
如果
儿子的儿子亮-儿子自己亮>0 也就是 儿子的儿子亮>儿子自己亮,此时就让儿子自己亮着就好
因为要保证只要有一个儿子,维护的最后一个一定是让儿子自己亮着的最优解

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
#define inf 10005
const int maxn=1e4+5;
int n;
int dp[maxn][3];
vector<int>Q[maxn];
void dfs(int u,int fa);
int main(){
	scanf("%d",&n);
	for(int aa,bb,i=1;i<n;i++){
		scanf("%d%d",&aa,&bb);
		Q[aa].push_back(bb);
		Q[bb].push_back(aa);
	}
	dfs(1,1);
	cout<<min(dp[1][0],dp[1][2])<<endl;
     return 0;
}
//0--->自己 1--->父亲 2--->儿子 
 
void dfs(int u,int fa){
	dp[u][0]=1;
	multiset<int>T;
	multiset<int>::iterator id ,ed;
	for(int i=0;i<Q[u].size();i++){
		int to=Q[u][i];
		if(to==fa)continue;
		dfs(to,u);
		dp[u][0]+=min(dp[to][0],min(dp[to][1],dp[to][2]));
		dp[u][1]+=min(dp[to][0],dp[to][2]);
		dp[u][2]+=dp[to][0];
		T.insert(dp[to][2]-dp[to][0]); 
		}
		if(T.empty())
		dp[u][2]=inf;
		else {
			id=T.begin();ed=T.end();ed-- ;
		for(;id!=ed;id++){
			if(*id<0)dp[u][2]+=*id;
			else break;
		}
		}
}

标签:USACO08JAN,点亮,int,自己,儿子,Cell,Phone,dp,define
来源: https://www.cnblogs.com/wzxbeliever/p/16062235.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有