CF1444E Finding the Vertex

题目描述

这是一个交互题。 给定一棵树——即一个无环连通无向图。其中有一个特殊的顶点,你需要找出它是哪一个。你可以进行如下形式的提问:给定树上的一条边,询问哪一个端点距离特殊顶点更近,也就是说,哪一个端点到特殊顶点的最短路径包含的边数更少。你需要通过最少次数的提问,在最坏情况下找出特殊顶点。 请注意,特殊顶点可能不是事先固定的:交互器可以在保证之前所有回答一致的前提下,随时将特殊顶点更换为其他顶点。

输入格式

输入一个整数 $n$($2 \le n \le 100$),表示树的顶点数。 接下来的 $n-1$ 行,每行包含两个整数 $u$ 和 $v$($1 \le u, v \le n$),表示树上的一条边,连接顶点 $u$ 和 $v$。保证给定的边构成一棵树。

输出格式

读入输入数据后,你可以开始进行询问。你可以进行两种操作: 1. `? u v` —— 询问树上的一条边 $(u, v)$($1 \le u, v \le n$),哪一个端点距离特殊顶点更近。该询问的答案是两个端点中的一个。注意,$u$ 和 $v$ 必须通过一条边直接相连,并且它们到特殊顶点的距离不会相等。 2. `! u` —— 表示你已经找到特殊顶点 $u$。在输出该操作后,程序必须立即终止。 不要忘记在每次输出后换行并刷新输出缓冲区,否则会收到“Idleness limit exceeded”的判定。刷新输出的方法如下: - C++:`fflush(stdout)` 或 `cout.flush()`; - Java:`System.out.flush()`; - Pascal:`flush(output)`; - Python:`sys.stdout.flush()`; - 其他语言请查阅相关文档。 如果你在某棵树上询问次数超过了最坏情况下所需的最小次数,将会收到 Wrong answer 的判定。

说明/提示

本题禁止 Hack。 由 ChatGPT 4.1 翻译