#P1300. Door Man
Door Man
描述
你是一座大豪宅的管家。这座豪宅的房间如此之多,以至于只能用数字来指代它们(房间 0、1、2、3 等等)。你的主人是个特别粗心大意的家伙,总是在房子的某一层把许多门都敞开着。多年来,你已经掌握了一种技巧,能够沿着一条路径穿过这些凌乱(门开着)的房间,并随手关上身后的门。你面临的最大问题是判断是否有可能找到一条穿过这些凌乱房间的路径,并且满足以下条件:
- 在穿过一扇敞开的门后,必须立即关上身后的门。
- 绝不能打开一扇关闭的门。
- 最终要回到你的房间(0 号房间),并且所有的门都已关闭。
在这个问题中,你会得到一个房间列表,以及这些房间之间敞开的门的信息(同时还会给出一个起始房间)。不需要确定具体的路线,只需要判断是否存在这样一条可行的路线。
输入
本题的输入将包含一系列(非空)最多 100 个数据集。每个数据集都将按照以下描述的格式进行格式化,并且数据集之间不会有空白行分隔。
单个数据集由 3 个部分组成:
- 起始行:一行内容为 “START M N”,其中 M 表示管家的起始房间,N 表示房子里的房间数量。
- 房间列表:一系列共 N 行。对于单个房间,每一行列出了每一扇通向编号更大房间的敞开的门。例如,如果 3 号房间有通向 1 号、5 号和 7 号房间的敞开的门,那么 3 号房间对应的行将是 “5 7”(因为只列出通向编号更大房间的门,所以 1 号房间不会出现在这一行)。列表中的第一行代表 0 号房间,第二行代表 1 号房间,依此类推,直到最后一行,代表 号房间。行可能为空(特别是,最后一行总是空的,因为它是编号最大的房间)。在每一行中,相邻的房间总是按升序列出。有可能多个门连接着相同的两个房间!
- 结束行:一行内容为 “END”。
在最后一个数据集之后,会有一行内容为 “ENDOFINPUT”。
请注意,在任何单个数据集中,门的数量不会超过 100 个。
输出
对于每个数据集,将恰好有一行输出。如果管家能够(按照前面介绍中的规则)走进他的房间并关上最后一扇敞开的门,打印一行 “YES X”,其中 X 是他关上的门的数量。否则,打印 “NO”。
输入示例
START 1 2
1
END
START 0 5
1 2 2 3 3 4 4
END
START 0 10
1 9
2
3
4
5
6
7
8
9
END
ENDOFINPUT
输出示例
YES 1
NO
YES 10
来源
2002 年美国中南部地区竞赛