P16106 [ICPC 2019 NAIPC] Planes, Trains, but not Automobiles
题目描述
当一名旅行推销员可不是件轻松的事。Per 就是这样一名推销员,他想找到一种高效的方式,恰好访问外国所有城市一次。
Per 以一种奇特的方式定义效率,因为他讨厌坐飞机。更糟糕的是,他坚决拒绝使用汽车。Per 最喜欢的交通工具是火车。他乐意尽可能多地乘坐火车。
这个国家的铁路系统非常奇特,也非常有限。所有火车线路都是单向的,一旦有人乘火车离开一个城市,就不存在任何火车线路序列能让他回到那个城市。这是因为国家想通过更昂贵的飞机来赚钱。在这个国家,每个城市都恰好有一个机场,因此你可以乘飞机从任意城市前往任意其他城市。
Per 不仅想知道他需要的最少航班次数,还想知道在那些以最少航班次数完成旅行的路线中,他可以在哪些城市访问机场。你看,Per 喜欢机场的餐厅,他想知道哪些餐厅他可以去,以便选择路线来访问他最喜欢的餐厅。如果他在某个城市乘飞机起飞或降落,就可以访问该城市的机场。注意,Per 可以从任意城市开始。
考虑一个有四个城市的国家,箭头表示单向火车路线:
:::align{center}

:::
Per 可以采取多种可能的旅行路线,但他至少需要乘坐一次飞机。以下是一些(并非全部)使用最少航班次数的可能路线,其中 $\rightarrow$ 表示火车行程,$\Rightarrow$ 表示飞机行程:
$$
\begin{aligned}
1 \rightarrow 2 \rightarrow 4 &\Rightarrow 3 \\
2 \rightarrow 4 &\Rightarrow 1 \rightarrow 3 \\
1 \rightarrow 3 \rightarrow 4 &\Rightarrow 2
\end{aligned}
$$
在这个例子中,每个机场都至少出现在某条路线上。Per 可以选择自己的路线,以便访问他想要的任何机场餐厅。
输入格式
每个测试用例的第一行包含两个空格分隔的整数 $n$($1 \leq n \leq 10^5$)和 $m$($0 \leq m \leq 10^5$),其中 $n$ 是城市数量,$m$ 是火车线路的数量。城市编号为 $1 \ldots n$。
接下来的 $m$ 行,每行包含两个空格分隔的整数 $a$ 和 $b$($1 \leq a, b \leq n$,$a \neq b$),表示有一条从城市 $a$ 到城市 $b$ 的火车线路(但没有反向线路)。所有火车线路互不相同。
输出格式
输出恰好两行。
第一行输出一个整数,表示 Per 为了访问所有城市所需的最少航班次数。
第二行输出一个空格分隔的整数列表,列出他可以在最少航班次数的路线上$ $访问机场的城市。如果他能在 **某一条** 使用最少航班次数的路线上$ $访问该城市的机场,则该城市应被列出。按升序输出这些编号。如果没有需要访问的机场,则输出一个空行。
说明/提示
翻译由 DeepSeek V3.2 完成