#USACO1433. 街头竞速

街头竞速

下图给出了一个街头竞速的跑道示例。

race.gif

你可以看到一些点,标记为 0N,一些箭头将它们连接了起来。

0 处是比赛的起点,点 N 处是比赛的终点。

在上图中,N=9

箭头代表单向街道。

比赛的参与者仅可沿着箭头的方向在街道上从点到点进行移动。

在每一个点上,参与者都可以沿着任意一个由该点发出的箭头的方向走向邻近的点。

一个合规的比赛跑道应该具备以下特点:

  • 从起点出发可以到达跑道中的所有点。
  • 从任意一个点出发都可以到达跑道的终点。
  • 不存在任何由终点发出的箭头。

参与者从起点到达终点的过程中,可以不经过所有的点。

但是,有一些点却是不得不经过的,我们称之为必经点。

在示例中,点 0,3,6,9 就是必经点。

现在,给定一个合规的跑道,请你找出除了起点和终点以外的所有必经点。

假设,比赛要分两天进行。

因此,需要将跑道分为两个分赛道,每天参与者需要跑完一个分赛道。

第一天起点在 0 点,终点在某个中间点(称之为分割点)。

第二天起点在分割点,终点在 N 点。

你还需要确定跑道中的所有可能的分割点。

一个点 S 能够成为跑道的分割点,需满足:

  • 该点不是跑道的起点或终点。
  • 跑道可以被该点分割成两个部分,且两部分都是合规的。
  • 被分割的两个部分不存在公共箭头,点 S 是两部分唯一的公共点,在其中一部分作为终点,另一部分作为起点。

在示例中,只有点 3 是分割点。

输入格式

输入包括一个合规赛道的信息,该赛道最多包含 50 个点,100个箭头。

输入共有 N+2 行。

N+1 行,第 i 行包含了从点 i1 发出的箭头能到达的所有点,这些点全部描述完毕后,包含一个 2-2作为行结尾。

最后一行,只包含一个整数 1-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