为什么树形dp不能做???
查看原帖
为什么树形dp不能做???
284715
遮云壑楼主2020/10/26 15:09

dfs1求出每个节点的子树大小和最大的儿子子树,dfs2统计个数,每次不统计最大儿子子树,flag确保只会减掉一颗子树

#include<bits/stdc++.h>
#define maxn 310
using namespace std;

inline void read(int &x)
{
	int y=1;
	x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')y=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	x=x*y;
}

int n,p;
vector<int> g[maxn]; 

inline void add(int u,int v)
{
	g[u].push_back(v); 
	g[v].push_back(u); 
}

int dp[maxn],son[maxn];

void dfs1(int u,int fa)
{
	dp[u]=1;
	int maxson=0;
	for(int i=0;i<g[u].size() ;i++)
	{
		int v=g[u][i];
		if(v==fa)continue;
		dfs1(v,u);
		maxson=max(maxson,dp[v]);
		dp[u]+=dp[v];
	}
	son[u]=maxson;
}

int ans;
void dfs2(int u,int fa)
{
	bool flag=true;
	for(int i=0;i<g[u].size() ;i++)
	{
		int v=g[u][i];
		if(v==fa)continue;
		if(dp[v]==son[u]&&flag)
		{
			flag=false;
			continue;
		}
		dfs2(v,u);
	}
	ans-=son[u];
}

int main(){
	read(n);read(p);
	int u,v;
	for(int i=1;i<=p;i++)
	{
		read(u);read(v);
		add(u,v);
	}
	
	dfs1(1,0);
	ans=n;
	dfs2(1,0);
	
	printf("%d\n",ans);	
	return 0;
}

2020/10/26 15:09
加载中...