题号:NC279411
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld
题目描述
这是问题的困难版本。三个版本的做法之间可能有交集。
给定一颗

个点的无根树,每个节点有类型和权值,分别用

和

表示。一条简单路径的权值为这条路径包含的节点权值之和。
对于一个长度为
)
的序列

,假如

,并且

是一个长度为

的排列,那么称序列

是

- 特殊排列。
假如从

走到

长度为

的简单路径依次经过的节点类型组成的序列是一个

- 特殊排列,那么这个简单路径是一条

- 路径。
特别的,假如一条简单路径只由两个类型为

的节点组成,那么这条路径是

- 路径
对于

,输出一个整数,表示所有的

- 路径的最大权值,假如不存在,输出

。
提示:本题输入输出数据量较大,建议选手使用快速的输入输出方式。
输入描述:
第一行输入一个整数
,表示测试数据组数。接下来是
个测试用例。
每个测试用例第一行输入两个整数
。
第二行有
个数
,表示每个节点的类型。
第三行有
个数
,表示每个节点的权值。
然后
行,每一行有两个整数
,表示有一条
到
的无向边。
保证所有测试用例
的和不超过
。
输出描述:
对于每个测试用例,输出一行,包含
个空格分隔的整数,表示答案。
示例2
输入
复制
1
9
1 3 2 4 3 4 1 4 4
1 2 3 4 5 6 6 7 8
1 2
1 3
1 7
1 8
2 4
3 5
3 6
5 9
输出
复制
7 -1 11 24 -1 -1 -1 -1 -1