QOJ.ac

QOJ

時間限制: 4 s 記憶體限制: 256 MB 總分: 100

#8873. 钥匙

统计

Alice 和 Bob 住在一座巨大的豪宅里,豪宅里有 $n$ 个房间(其中一个房间是户外,他们在那里玩“月球游戏”)以及 $m$ 扇门。每扇门连接两个房间,或者连接一个房间和户外,并且每扇门都有一把唯一的钥匙,只能打开这扇门。每扇门在你通过后会自动关闭并上锁,因此通过每扇门都需要对应的钥匙。这座建筑非常大,但 Alice 和 Bob 只使用一个房间——他们的卧室。其他房间的存在只是为了让房子看起来更大,并让邻居们嫉妒。

这种不同寻常的房屋建造方式现在给 Alice 和 Bob 带来了一些麻烦。Bob 即将开始为期两周的旅行。一周后,Alice 也要去国外待一个月,当她离开时,她需要正确的钥匙才能离开房子。然而,Bob 也需要钥匙才能回到房子里,因为 Alice 在他回来时不在家,无法为他开门。Alice 和 Bob 现在正试图弄清楚如何分配钥匙,以便 Alice 能从 0 号房间(他们的卧室)走到 1 号房间(户外),而 Bob 能在一周后从 1 号房间(户外)走到 0 号房间(卧室)。

幸运的是,Alice 记得她可以在离开的路上丢下一些钥匙,供 Bob 在回来的路上捡起。这样,他们都可以通过相同的门。当然,她不能在 1 号房间(户外)丢下任何钥匙,因为邻居可能会发现它们并闯入他们的房子。

你能帮助 Alice 和 Bob 分配钥匙并规划他们的行程吗?

题目描述

给定 Alice 和 Bob 的豪宅描述:$n$ 个房间(编号为 $0$ 到 $n-1$)之间有 $m$ 扇门,其中 $1$ 号房间是户外,$0$ 号房间是卧室。第 $i$ 扇门可以用编号为 $i$ 的钥匙打开(从 $0$ 开始编号)。

首先,你需要输出两行,分别包含 Alice 和 Bob 所持有的钥匙编号(用空格分隔)。他们不需要使用所有的钥匙,但严禁两人同时持有同一把钥匙的副本(或者其中一人持有同一把钥匙的多个副本)。

然后,你需要输出 Alice 和 Bob 将要遵循的指令。首先,通过输出以下两种类型的命令,打印 Alice 从 0 号房间移动到 1 号房间的过程:

  • “MOVE x”:移动到房间 $x$(前提是 Alice 当前所在位置与 $x$ 之间有一扇门,且 Alice 持有该门的钥匙)。
  • “DROP k1 k2 ...”:在 Alice 当前所在的房间丢下钥匙 $k_1, k_2, \dots$(以空格分隔的整数)。这意味着 Alice 不再携带这些钥匙。

当 Alice 完成她的移动后,在下一行输出 “DONE”。她最终应停在 1 号房间。在遵循打印的指令时,Alice 多次经过 0 号或 1 号房间是允许的。

其次,通过输出以下两种类型的命令,打印 Bob 从 1 号房间移动到 0 号房间的过程:

  • “MOVE x”:移动到房间 $x$(前提是 Bob 当前所在位置与 $x$ 之间有一扇门,且 Bob 持有该门的钥匙)。
  • “GRAB”:捡起 Bob 当前所在房间里的所有钥匙。Bob 总是会捡起 Alice 留在房间里的所有钥匙。如果 Alice 没有留下任何钥匙,他将不会捡起任何东西。

当 Bob 完成他的移动后,在下一行输出 “DONE”。他最终应停在 0 号房间。在遵循打印的指令时,Bob 多次经过 0 号或 1 号房间是允许的。

备注:丢下空的钥匙列表,或者在没有钥匙的房间里执行 GRAB,或者在 1 号房间(即户外)执行 GRAB,虽然没有实际用途,但均被视为可接受的操作。

输入格式

第一行包含整数 $n$ 和 $m$,分别表示房间数量(包含户外)和门的数量。接下来 $m$ 行描述这些门。第 $i$ 行(从 $0$ 开始计数)包含整数 $a_i, b_i$,表示房间 $a_i$ 和 $b_i$ 之间有一扇门,由钥匙 $i$ 打开。

数据范围

  • $2 \le n, m \le 10^5$
  • $0 \le a_i, b_i < n$
  • 保证如果拥有所有钥匙,总是可以从任意房间到达其他任何房间。
  • 每对房间之间最多由一扇门连接。
  • 没有房间连接到自身。
  • 你的程序最多可以输出 $4 \cdot 10^5$ 条指令。

输出格式

首先,输出两行,描述钥匙的分配情况。然后,按任务描述中说明的那样,逐行输出 Alice 和 Bob 的所有指令。如果没有解决方案,输出 “No solution”。如果存在多个有效的解决方案,输出其中任意一个即可。

样例

样例输入 1

5 5
0 1
1 2
2 3
3 4
4 1

样例输出 1

0 1 2
3 4
MOVE 1
MOVE 2
MOVE 3
DROP 0
MOVE 2
MOVE 1
DONE
MOVE 4
MOVE 3
GRAB
MOVE 4
MOVE 1
MOVE 0
DONE

样例输入 2

3 2
0 2
1 2

样例输出 2

No solution

说明

第一个样例代表了如下的平面图,其中蓝色数字对应每扇门所需的钥匙 ID:

Alice 持有钥匙 0、1 和 2,而 Bob 持有钥匙 3 和 4。Alice 从 0 走到 1,然后走到 2,最后走到 3。在那里,她丢下了钥匙 0。她原路返回到 1。Bob 从 1 出发,走到 4,然后走到 3,在那里他捡起了钥匙 0。他原路返回到 1,并用刚捡到的钥匙 0 打开了通往 0 的门。

在第二个样例中,Alice 和 Bob 无法同时到达他们的目的地。注意 Alice 不能在 1 号房间丢下钥匙。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.