树形dp 50points求助
  • 板块学术版
  • 楼主cherry2009
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/29 14:50
  • 上次更新2024/11/29 16:05:07
查看原帖
树形dp 50points求助
1364716
cherry2009楼主2024/11/29 14:50

P2899

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[100010],b[100010];
vector<int> G[100010];
int dp[100010][4],g[100010]; //dp[i][0]被自己覆盖,dp[i][1]被儿子覆盖,dp[i][2]被父亲覆盖 
void dfs(int now,int fa){
	int tot=0;
	dp[now][0]=1;
	for(auto v:G[now]){
		if(v==fa) continue;
		dfs(v,now);
		dp[now][0]+=min(dp[v][0],min(dp[v][2],dp[v][1]));
		dp[now][2]+=min(dp[v][0],dp[v][1]);
		dp[now][1]+=dp[v][0];
		g[++tot]=dp[v][1]-dp[v][0];
	}
	if(tot==0){
		dp[now][1]=1e9;
	}
	else{
		sort(g+1,g+tot+1);
		for(int i=1;i<tot;i++){
			if(g[i]<0){
				dp[now][1]+=g[i];
			}
			else{
				break;
			}
		}	
	}
}
signed main(){
//	freopen("P2899_6.in","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n;
	cin>>n;
	for(int i=1;i<n;i++){
		cin>>a[i]>>b[i];
		G[a[i]].push_back(b[i]);
		G[b[i]].push_back(a[i]);
	}
	dfs(a[1],0);
	cout<<min(dp[a[1]][0],dp[a[1]][1]);
	return 0;
}
2024/11/29 14:50
加载中...