三叶草
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

给定一棵 n 个节点的无根树,每个节点都有一种颜色 col_i(黑或者白)。
  • 若存在 a,b,c,d4 个不同的节点满足 col_b=col_c=col_d , col_a\not=col_b,且 ab,c,d 均有邻边,则称 a,b,c,d 构成了一片三叶草。
你至多有 k 次修改,每次修改可以改变一个节点的颜色(黑 \to 白 或者 白 \to 黑),请问树上最多可以构成多少片三叶草。

输入描述:

第一行输入 2 个整数 n,k(1\leq n\leq 350,0\leq k\leq n),分别表示树的大小,最多修改的次数。

第二行输入 n 个数 col_i,表示每个节点的颜色(col_i=0 表示白色,col_i=1 表示黑色)。

接下来 n-1 行,每行输入两个正整数 u,v(1\leq u,v\leq n),表示 uv 之间有一条边。

输出描述:

请你输出树上最多可以构成多少片三叶草。
示例1

输入

复制
4 1
1 0 0 1
1 2
1 3
1 4

输出

复制
1

说明

可以把 col_4 改为 0,这样 1,2,3,4 构成了一片三叶草。
示例2

输入

复制
8 2
1 0 1 0 0 0 0 1
1 2
1 3
1 4
1 5
3 6
4 7
4 8

输出

复制
5

说明

一种能使得三叶草数量达到最大值的操作方式如下:
改变 3,7 节点的颜色,最终树上的三叶草有:\{1,2,3,4\}\{1,2,3,5\}\{1,3,4,5\}\{1,2,4,5\}\{4,1,7,8\},一共 5 个。