Jumping monkey
你是一名在丛林中追逐猴子的猎人。猴子藏在某棵树的枝叶后,你无法看到它的位置。每次你可以瞄准一棵树射击;如果猴子正藏在这棵树上,它就会被立即击中。否则,猴子会趁你重新装弹时跳到一棵与当前树相邻的树上,而你无法观察到它的移动。每次射击后,猴子都不会停留在原来的树上。
你需要判断是否存在一个射击序列,使得无论猴子的初始位置在哪里、之后如何跳跃,都一定能够击中它。如果存在,请找出射击次数最少的序列;猴子可能预知你的下一个射击目标,并始终采用对自己最有利的移动方式。
例如,当丛林中只有两棵相邻的树时,连续两次射击同一棵树即可保证击中猴子:如果第一次没有击中,猴子原本必然位于另一棵树上,随后只能跳到第一次射击的树上,因此第二次射击一定成功。
但并非所有丛林都存在必胜方案。例如,当有三棵树且它们两两相邻时,无论射击哪棵树,猴子都可以始终保留两个可能的位置,因此无法保证击中它。
输入格式
输入包含多组测试数据,相邻两组测试数据之间由一个空行分隔。
每组测试数据的第一行包含两个整数 和 ,分别表示树的数量和树之间的相邻关系数。
接下来 行,每行包含两个互不相同的整数,表示对应的两棵树相邻。树的编号为 至 。每对相邻关系只会出现一次,两个编号的顺序没有意义。
保证不存在树与自身相邻的情况,且任意两棵树之间都存在路径。
输入以仅包含两个 的一行结束,该行之前同样有一个空行。
输出格式
对于每组测试数据,输出一行。
如果不存在能够保证击中猴子的射击序列,输出 Impossible。
否则,输出最短射击序列,格式为 : 。其中 表示射击次数, 表示第 次射击的树的编号,各编号之间用单个空格分隔。
如果存在多个最短射击序列,输出字典序最小的一个。对于两个不同的序列,在第一个不同的位置上,编号较小的序列字典序更小。
样例输入
样例一
2 1
0 1
样例二
3 3
0 1
1 2
2 0
样例三
4 3
0 1
2 3
1 3
样例输出
样例一
2: 0 0
样例二
Impossible
样例三
4: 1 3 3 1
数据范围
- ;
- 树的编号范围为 至 ;
- 每条相邻关系连接两棵不同的树,且不会重复出现;
- 整个树林构成一张连通的无向图。
来源与许可
本题题面与测试数据整理自 BZOJ。
样例 1
输入
2 1
0 1
输出
2: 0 0
样例 2
输入
3 3
0 1
1 2
2 0
输出
Impossible
样例 3
输入
4 3
0 1
2 3
1 3
输出
4: 1 3 3 1