Anna 是 IOI 群岛的居民,她决定邀请朋友 Bruno 来 IOI 群岛游玩。IOI 群岛由 $N$ 个岛屿组成,编号为 1 到 $N$。此外,IOI 群岛有 $N-1$ 座桥,编号为 0 到 $N-2$。桥 $i$ 双向连接岛 $A_i$ 和岛 $B_i$。此外,从任何一个岛屿都可以通过桥到达其他所有岛屿。Anna 的家在岛 $T$ 上,但 Bruno 不知道 Anna 家所在的岛屿编号。
为了帮助 Bruno,Anna 决定在每个岛屿上竖立一面旗帜,并在每面旗帜上写下一个整数。Anna 不知道 Bruno 会到达哪个岛屿。
Bruno 乘船到达岛 $S$。当 Bruno 到达岛 $S$ 时,他会获得以下信息: 到达的岛屿编号 $S$,以及岛 $S$ 上旗帜所写的整数。 所有与岛 $S$ 直接通过桥相连的岛屿编号,以及这些岛屿上旗帜所写的整数。
当 Bruno 从岛 $S$ 前往岛 $T$ 时,他必须走经过桥数量最少的路径。 Bruno 能否仅凭他获得的信息,判断他到达的岛屿 $S$ 是否就是 Anna 的家所在的岛屿 $T$,并在 $S$ 与 $T$ 不同时,正确选择下一个要前往的岛屿呢?
任务
给定 IOI 群岛的信息,编写一个程序来实现 Anna 的策略,即在岛屿上竖立写有整数的旗帜。此外,编写一个程序来实现 Bruno 的策略,即根据到达岛屿时获得的信息,正确选择下一步行动。
实现细节
你必须使用同一种编程语言提交两个文件。
第一个文件名为 Anna.c 或 Anna.cpp。该文件实现了 Anna 的策略,必须实现以下例程:
void Anna(int K, int N, int T, int A[], int B[])
该例程在程序开始时仅被调用一次。
参数 K 是子任务编号 K。
参数 N 是 IOI 群岛的岛屿数量 N。
参数 T 是 Anna 家所在的岛屿编号 T。
参数 A 和 B 是长度为 $N-1$ 的数组。元素 A[i] 和 B[i] 表示桥 $i$ 连接岛 A[i] 和 B[i] ($0 \le i \le N-2$)。
此外,必须调用以下例程在岛屿上竖立旗帜:
void Flag(int I, int V)参数
I表示 Anna 竖立旗帜的岛屿编号。- 参数
V表示 Anna 在旗帜上写的整数。
注意,Flag 的调用必须满足以下条件:
I 必须是 1 到 $N$ 之间的整数。如果不满足,则判为不正确 [1]。
不能使用相同的 I 调用 Flag 两次或以上。如果不满足,则判为不正确 [2]。
V 必须是 0 到 $N$ 之间的整数。如果不满足,则判为不正确 [3]。
Flag 必须恰好被调用 $N$ 次。如果不满足,则判为不正确 [4]。
如果 Flag 的调用被判定为不正确,程序执行将立即终止。
第二个文件名为 Bruno.c 或 Bruno.cpp。该文件实现了 Bruno 的策略,必须实现以下例程:
void Bruno(int K, int S, int F, int L, int P[], int Q[])
该例程在 Anna 被调用后仅被调用一次。
参数 K 是子任务编号 K。
参数 S 是 Bruno 到达的岛屿编号 S。
参数 F 是岛 S 上旗帜所写的整数。
参数 L 是与岛 S 直接通过桥相连的岛屿数量 L。
参数 P 是长度为 L 的数组,包含与岛 S 直接相连的岛屿编号。
参数 Q 是长度为 L 的数组,元素 Q[j] 表示岛 P[j] 上旗帜所写的整数 ($0 \le j \le L-1$)。
此外,必须调用以下例程来判断 Bruno 到达的岛屿 $S$ 是否有 Anna 的家,如果不是,则必须正确选择下一个要前往的岛屿:
void Answer(int X)参数
X是:如果 Bruno 到达的岛屿上有 Anna 的家,则为 Anna 家所在的岛屿编号T;否则,为 Bruno 下一个要前往的岛屿编号。
注意,Answer 的调用必须满足以下条件:
参数 X 必须是数组 P 的元素之一,或者为 S。如果不满足,则判为不正确 [5]。
如果 Answer 被调用两次或以上,则判为不正确 [6]。
如果没有调用 Answer,则判为不正确 [7]。
如果岛 S 上有 Anna 的家,但参数 X 不为 T,则判为不正确 [8]。
* 如果岛 S 上没有 Anna 的家,但参数 X 不是下一个要前往的岛屿,则判为不正确 [9]。
在 Bruno 例程被调用后,将进行答案判定。
你可以自由实现其他例程或声明全局变量以供内部使用。但是,由于提交的两个程序将与评分程序链接在一起成为一个可执行文件,因此必须将每个文件中的所有全局变量和内部例程声明为 static,以避免与其他文件产生冲突。在评分时,该程序将作为 Anna 侧和 Bruno 侧两个进程运行,因此 Anna 侧和 Bruno 侧无法共享程序中的全局变量。
你的提交不得以任何方式与标准输入、标准输出或其他文件进行交互。
数据范围
所有输入数据满足以下条件: $2 \le N \le 100\,000$ $1 \le S \le N$ $1 \le T \le N$ $1 \le A_i \le N$ ($0 \le i \le N-2$) $1 \le B_i \le N$ ($0 \le i \le N-2$) $1 \le K \le 4$ * 从 IOI 群岛的任何岛屿都可以通过桥到达所有其他岛屿。
子任务
子任务 1 [10 点]
- 满足 $K = 1$。
子任务 2 [15 点]
- 满足 $K = 2$。
- 传递给
Flag的参数V的值必须在 0 到 2 之间。
子任务 3 [20 点]
- 满足 $K = 3$。
- 传递给
Flag的参数V的值必须为 0 或 1。 - 不存在恰好与 2 个岛屿通过桥直接相连的岛屿。
- 满足 $S \neq T$。
子任务 4 [55 点]
- 满足 $K = 4$。
- 传递给
Flag的参数V的值必须为 0 或 1。
样例
输入格式 1
5 3 2 1 1 3 3 2 3 4 4 5 2
输出格式 1
Accepted : V_max = 1
说明
此样例展示了交互过程。对于 Anna 和 Bruno 函数的调用参数如下:
Anna 调用参数: * $K=1, N=5, T=2, A=\{1, 3, 3, 4\}, B=\{3, 2, 4, 5\}$
Bruno 调用参数: * $K=1, S=3, F=0, P=\{2, 1, 4\}, Q=\{1, 1, 0\}$
注意:此例中 Flag 的调用不一定具有实际意义。