Codeforces Round #774 (Div. 2) D. Weight the Tree 树形dp

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N=2e5+10;
int n,v,u;
vector<int> G[N];
int dp[N][2],g[N][2];
void dfs(int x,int fa){
	dp[x][1]=1;dp[x][0]=0;
	g[x][1]=G[x].size();g[x][0]=1;
	for(int i=0;i<G[x].size();i++){
		int to=G[x][i];
		if(to==fa) continue;
		dfs(to,x);
		dp[x][0]+=max(dp[to][0],dp[to][1]);
		g[x][1]+=g[to][0];
		dp[x][1]+=dp[to][0];
		if(dp[to][1]>dp[to][0]){
			g[x][0]+=g[to][1];
		}else if(dp[to][1]<dp[to][0]){
			g[x][0]+=g[to][0];
		}else g[x][0]+=min(g[to][1],g[to][0]);
	}
}
int ans[N],res=0;
void dfs(int x,int fa,int fl){
	if(fl==1) ans[x]=G[x].size();
	else ans[x]+=1;
	res+=ans[x];
	for(int i=0;i<G[x].size();i++){
		int to=G[x][i];
		if(to==fa) continue;
		if(fl==1){
			dfs(to,x,0);continue;
		}
		// cout<
		if(dp[to][0]==dp[to][1]){
			if(g[to][0]<g[to][1]) dfs(to,x,0);
			else dfs(to,x,1);
		}
		else if(dp[to][0]>dp[to][1]) dfs(to,x,0);
		else dfs(to,x,1);
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		scanf("%d%d",&u,&v);
		G[u].push_back(v);G[v].push_back(u);
	}
	if(n==2){
		cout<<2<<" "<<2<<endl;
		cout<<1<<" "<<1<<endl;
		return 0;
	}
	dfs(1,0);
	if(dp[1][0]==dp[1][1]){
		if(g[1][0]<g[1][1]){
			 dfs(1,0,0);
			 cout<<dp[1][0]<<" "<<g[1][0]<<endl;
		}else{
			dfs(1,0,1);
			cout<<dp[1][1]<<" "<<g[1][1]<<endl;
		}
		
	}else if(dp[1][0]<dp[1][1]){
		dfs(1,0,1);
		cout<<dp[1][1]<<" "<<g[1][1]<<endl;
	}else{
		dfs(1,0,0);
		 cout<<dp[1][0]<<" "<<g[1][0]<<endl;
	}
	// cout<
	// cout<
	for(int i=1;i<=n;i++){
		cout<<ans[i]<<" ";
	}cout<<endl;
	// cout<
}

你可能感兴趣的:(acm,深度优先,动态规划,算法)