#P12104. [NERC2024] Managing Cluster
[NERC2024] Managing Cluster
Description
你打算开发一个集群管理扩展,以提升产品性能。你的产品包含 个服务(编号从 到 ),运行在一个拥有 台机器(编号从 到 )的集群上。每个服务运行恰好两个副本,每个副本部署在某台机器上。每台机器恰好运行一个服务的副本。
这个集群性能的关键因素之一是网络结构。一些机器之间存在直接连接,能够高效传输数据。一共存在 条直接连接,并且任意两台机器之间都可以通过这些连接实现通信。换句话说,这些直接连接构成了一棵树。
部署过程中, 个副本已分配到机器。你的扩展程序将获取所有直接连接的信息,以及一个长度为 的序列 ,其中 表示第 台机器上运行的服务编号。
你的程序可以对副本进行交换操作。一次交换操作选定两台机器 和 ,交换 和 的值。每台机器最多参与一次交换操作。
你需要设计一组交换操作,以使集群性能最大化。
由于同一服务的两个副本之间的数据交换最为频繁,集群性能定义为:有多少个服务的两个副本位于一对直接连接的机器上。
请你编写程序,输出一组交换操作,使得集群性能最大。
Input Format
第一行包含一个整数 ,表示测试用例的数量。
每组测试用例包括如下内容:
- 第一行一个整数 ,表示服务数量;
- 第二行 个整数 (),表示每台机器当前运行的服务编号。保证每个服务编号出现恰好两次;
- 接下来的 行,每行两个整数 (,),表示第 台机器与第 台机器之间存在直接连接。保证这些连接构成一棵树。
保证所有测试用例中 的总和不超过 。
Output Format
对于每组测试用例:
- 第一行输出一个整数 ,表示进行的交换操作次数;
- 接下来的 行,每行输出两个整数 和 (,),表示将第 台机器和第 台机器上的服务副本进行交换。注意,每台机器至多参与一次交换。
交换操作的顺序无关紧要。交换完成后,集群性能必须达到最大。输出任意一组满足条件的解均可。
3
2
1 2 2 1
1 2
2 3
3 4
4
4 3 1 3 2 4 1 2
1 2
3 1
3 4
5 1
5 6
2 7
2 8
3
1 1 2 2 3 3
1 2
1 3
1 4
1 5
1 6
1
1 3
3
1 5
8 3
4 7
0
Hint
在第一个测试用例中,只有服务 的两个副本处于相邻的机器上,因此性能为 。通过交换机器 和 上的副本,可以使服务 和服务 的副本都位于相邻机器上,性能提升至 。

在第二个测试用例中,没有任何服务的副本处于相邻机器上,初始性能为 。通过交换 , 和 三对机器,可以让服务 、 和 的副本分别配对,从而性能提升到 。可以证明此时无法再提升至 。

在第三个测试用例中,只有服务 的两个副本在相邻机器上,性能为 ,且无法进一步提升。

京公网安备 11011102002149号