“Ulovi me, ulovi me, kupit ću ti novine!” ——这是克罗地亚儿童中流行的一首游戏歌谣,翻译过来就是“抓住我,我就给你买报纸”。
Ankica 和 Branko 在一个无向连通图上玩一个追逐游戏。具体来说,Branko 在图中移动,而 Ankica 试图抓住他。游戏按回合进行,每一回合包含以下步骤:
- Ankica 对 Branko 的位置进行猜测。更准确地说,她猜测 Branko 当前位于某个特定的节点。如果她猜对了,Branko 就被抓住,游戏结束。否则,
- Branko 沿着与他当前位置相连的一条边移动。换句话说,Branko 移动到他的一个邻居节点。注意,Branko 不能停留在当前位置。
给定一个图,确定 Ankica 是否有一种有限的策略,无论 Branko 如何移动以及他的起始位置在哪里,都能保证抓住他。
更正式地,我们将 Ankica 的策略表示为一个数组 $A = (a_1, a_2, \dots, a_k)$,其中 $a_i$ 表示 Ankica 在第 $i$ 回合的猜测(即她猜测 Branko 位于节点 $a_i$)。
类似地,我们将 Branko 的移动表示为一个数组 $B = (b_1, b_2, \dots, b_k)$,其中 $b_i$ 表示 Branko 在第 $i$ 回合开始前所处的节点。此外,对于任意两个连续的元素 $b_i$ 和 $b_{i+1}$ ($1 \le i < k$),图中必须存在一条连接节点 $b_i$ 和 $b_{i+1}$ 的边。注意,数组 $A$ 没有此限制。
如果 Ankica 的策略是成功的,即她在最多 $k$ 回合内抓住 Branko,那么对于每一个长度为 $k$ 的合法数组 $B$,都存在某个 $i$ ($1 \le i \le k$) 使得 $a_i = b_i$ 成立。
如果存在这样的策略,你应该找到一个使 $k$ 最小化的策略。
如果你能为 Ankica 提供一个成功但非最优的策略(即 $k$ 不是最小值的策略),你也可以在这一任务中获得部分分数。详见“子任务”部分。
输入格式
第一行包含两个整数 $N$ 和 $M$ ($N - 1 \le M \le \frac{N(N-1)}{2}$),分别表示图中的节点数和边数。图中的节点用 $1$ 到 $N$ 的整数表示。
接下来的 $M$ 行,第 $i$ 行包含两个空格分隔的整数 $u_i$ 和 $v_i$ ($1 \le u_i, v_i \le N, u_i \neq v_i$),表示一条连接节点 $u_i$ 和 $v_i$ 的无向边。
输入中不会出现重复的边,且图是连通的。
输出格式
如果 Ankica 没有成功的策略,直接在第一行输出 "NO" 并终止程序。
否则,第一行输出 "YES"。 第二行包含题目描述中的数字 $k$。 第三行包含题目描述中的 $k$ 个数字 $a_1, a_2, \dots, a_k$。
子任务
| 子任务 | 分值 | 数据范围 |
|---|---|---|
| 1 | 12 | $1 \le N \le 20$ |
| 2 | 8 | $1 \le N \le 1000, M = N - 1$, 每个节点 $u = 1, \dots, N - 1$ 都与节点 $u + 1$ 相连 |
| 3 | 80 | $1 \le N \le 1000$ |
如果你的程序在特定测试用例的第一行正确输出了 "YES",但未能提供成功的策略,该测试用例将获得该子任务分值的 50%。
如果你的程序在第一行正确输出了 "YES" 并提供了一个成功但非最优的策略,该测试用例将获得该子任务分值的 75%。此外,为了获得这些分数,输出策略中的回合数 ($k$) 必须最多为 $5N$。可以证明,最优策略中的回合数不会超过 $5N$。
每个子任务的分数等于其所有测试用例中获得的最低分数。
样例
样例输入 1
7 6 1 2 1 3 1 4 1 5 1 6 1 7
样例输出 1
YES 2 1 1
说明 1
如果 Branko 最初位于节点 1,他将在第一回合被抓住。否则,他将在第二回合被抓住。
样例输入 2
6 6 1 2 2 3 3 1 1 4 2 5 3 6
样例输出 2
NO
说明 2
假设 Branko 的初始位置在节点 1、2 或 3 之中,且不同于 $a_1$。这些节点中的每一个都与另外两个相连,因此 Branko 在每一回合都有两个移动选择。至少有一个选择是安全的,所以 Ankica 没有成功的策略。
Figure 1. Graphs corresponding to Sample 1 and Sample 2