CodeForces - 1118F1 Tree Cutting (Easy Version)(树形dp)

题目链接:点击查看

题目大意:给定n个点,每个点的权值分别对应颜色:0:无颜色,1:红色,2:蓝色,现在需要切割边,使切割后的两个部分不能出现红色和蓝色掺杂的部分,也就是说两个部分必须只能各自含有一个颜色,问这样的边最多能有几条

题目分析:树形dp的思想,用dfs记录以当前点为根节点的子树中红色点和蓝色点的个数,边界为当该子树中红色节点或蓝色节点等于整棵树中的红色节点或蓝色节点,并且另一种颜色的节点数量为0时,表示该子树只包含有一种全部颜色的节点,故当前边是符合条件的,记录后输出即可

上代码:

#include
#include 
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

typedef long long LL;

const int inf=0x3f3f3f3f;

const int N=3e5+100;

int a[N];

int blue[N],red[N];

vectornode[N];

int ans;

void dfs(int u,int fa)
{
	if(a[u]==1)
		red[u]=1;
	if(a[u]==2)
		blue[u]=1;
	for(int i=0;i

 

你可能感兴趣的:(树形dp)