#USACO1433. 街头竞速
街头竞速
下图给出了一个街头竞速的跑道示例。
你可以看到一些点,标记为 0∼N,一些箭头将它们连接了起来。
点 0 处是比赛的起点,点 N 处是比赛的终点。
在上图中,N=9。
箭头代表单向街道。
比赛的参与者仅可沿着箭头的方向在街道上从点到点进行移动。
在每一个点上,参与者都可以沿着任意一个由该点发出的箭头的方向走向邻近的点。
一个合规的比赛跑道应该具备以下特点:
- 从起点出发可以到达跑道中的所有点。
- 从任意一个点出发都可以到达跑道的终点。
- 不存在任何由终点发出的箭头。
参与者从起点到达终点的过程中,可以不经过所有的点。
但是,有一些点却是不得不经过的,我们称之为必经点。
在示例中,点 0,3,6,9 就是必经点。
现在,给定一个合规的跑道,请你找出除了起点和终点以外的所有必经点。
假设,比赛要分两天进行。
因此,需要将跑道分为两个分赛道,每天参与者需要跑完一个分赛道。
第一天起点在 0 点,终点在某个中间点(称之为分割点)。
第二天起点在分割点,终点在 N 点。
你还需要确定跑道中的所有可能的分割点。
一个点 S 能够成为跑道的分割点,需满足:
- 该点不是跑道的起点或终点。
- 跑道可以被该点分割成两个部分,且两部分都是合规的。
- 被分割的两个部分不存在公共箭头,点 S 是两部分唯一的公共点,在其中一部分作为终点,另一部分作为起点。
在示例中,只有点 3 是分割点。
输入格式
输入包括一个合规赛道的信息,该赛道最多包含 50 个点,100个箭头。
输入共有 N+2 行。
前 N+1 行,第 i 行包含了从点 i−1 发出的箭头能到达的所有点,这些点全部描述完毕后,包含一个 作为行结尾。
最后一行,只包含一个整数 ,表示输入结束。
输出格式
输出共两行。
第一行,首先输出一个整数,表示必经点的数量,然后按升序输出所有必经点的编号(不包括起点和终点)。
第二行,首先输出一个整数,表示分割点的数量,然后按升序输出所有分割点的编号。
1 2 -2
3 -2
3 -2
5 4 -2
6 4 -2
6 -2
7 8 -2
9 -2
5 9 -2
-2
-1
2 3 6
1 3