斯芬克斯为你准备了一个谜题。给定
对顶点序列
现在有
若一条路径
你知道图中顶点和边的关系,但是你不知道每个顶点的颜色。你希望通过重新着色实验来弄清楚顶点的颜色。
在一次重新着色实验中,你可以对任意多的顶点进行重新着色。具体来说,在一次重新着色实验中,你先给出一个长度为
注意:你可以在重新着色的过程中使用斯芬克斯之色。
在将每个顶点
你的任务是至多通过
实现细节
你要实现以下函数。
std::vector<int> find_colours(int N, std::vector<int> X, std::vector<int> Y)
:图中顶点的数量。 , :两个长度为 的数组,描述图中的边。- 该函数应该返回一个长度为
的数组 ,表示图中顶点的颜色。 - 对每个测试用例,该函数恰好被调用一次。
以上函数可以通过调用下面的函数来进行重新着色实验:
int perform_experiment(std::vector<int> E)
:长度为 的数组,指定顶点重新着色的方式。- 该函数返回根据
所给出的方式进行重新着色后单色分支的数量。 - 该函数至多只能调用
次。
评测程序不是自适应的。也就是说,顶点的颜色在调用 find_colours
之前就已经固定下来了。
约束条件
- 对所有满足
的 ,都有 。 - 对所有满足
的 和 ,都有 或 。 - 每对顶点被某条路径连接。
- 对所有满足
的 ,都有 。
子任务
子任务 | 分数 | 额外的约束条件 |
---|---|---|
1 | ||
2 | ||
3 | 给定的图是一条路径: |
|
4 | 给定的图是完全图: |
|
5 | 没有额外的约束条件。 |
在每个子任务中,如果你的程序正确给出了每对相邻顶点是否具有相同颜色,那么也会获得部分分数。
更准确地说,如果在所有测试用例中 find_colours
返回的数组
- 对所有满足
的 ,都有 ; - 对所有满足
的 ,都有: 当且仅当 。
例子
考虑以下函数调用。
find_colours(4, [0, 1, 0, 0], [1, 2, 2, 3])
在这个例子中,假设顶点的(隐藏的)颜色是
假设该函数以下列方式调用 perform_experiment
。
perform_experiment([-1, -1, -1, -1])
这次调用没有重新着色任何顶点,因此所有顶点都保持它们原来的颜色。
顶点
顶点
总共有
再假设该函数以下列方式调用 perform_experiment
。
perform_experiment([0, -1, -1, -1])
这次调用只把顶点
此时所有顶点都属于同一个单色分支,因此本次函数调用返回
假设该函数还以下列方式调用 perform_experiment
。
perform_experiment([-1, -1, -1, 2])
这次调用把顶点
这时有
然后函数 find_colours
返回数组
此外,也还有多种返回值,例如
评测程序示例
输入格式:
N M C[0] C[1] ... C[N-1] X[0] Y[0] X[1] Y[1] ... X[M-1] Y[M-1]
输出格式:
L Q G[0] G[1] ... G[L-1]
这里,find_colours
返回的数组 perform_experiment
的次数。
时间限制:
空间限制: