#CF2042E. 顶点对
顶点对
E. 顶点对
时间限制:3 秒
内存限制:512 MB
有一棵包含 个顶点的树。树是一个无环连通无向图。每个顶点上写有一个 到 的整数。每个值 到 恰好出现在两个不同的顶点上。每个顶点还有一个代价 —— 顶点 的代价为 。
你需要选出树的一个顶点子集,使得:
- 该子集是连通的;即子集中的任意顶点可以通过只经过子集中的顶点到达子集中其他任意顶点;
- 每个 到 的值至少出现在子集的一个顶点上。
在所有这样的子集中,你需要找到总代价最小的那个。注意,你不需要最小化子集中的顶点数。
输入
第一行包含一个整数 ()。
第二行包含 个整数 ()。每个值 到 恰好出现两次。
接下来 行,每行包含两个整数 和 ()—— 树的边。这些边构成一棵合法的树。
输出
第一行输出一个整数 —— 子集中的顶点数。
第二行输出 个 到 的不同整数 —— 所选子集中的顶点编号。顶点可以按任意顺序输出。
示例
输入:
3
1 1 3 2 3 2
4 2
1 6
6 2
6 3
2 5
输出:
3
2 4 5
输入:
3
2 3 1 3 2 1
6 4
2 4
5 2
3 6
3 1
输出:
4
1 3 4 6
输入:
6
5 2 3 4 6 4 2 5 6 1 1 3
10 8
2 10
12 7
4 10
5 9
6 2
1 9
3 4
12 6
11 5
4 5
输出:
6
2 3 4 5 8 10
说明

图片展示了前两个示例的答案。括号中的数字是顶点上写的值。
在第一个示例中,存在有效的子集如:(代价为 ),(代价为 ),(代价为 ),(代价为 )等。
在第二个示例中,子集 的代价为 。