U153876 拓扑排序

题目描述

给定一个有 $n$ 个节点的有向图,对此图进行排序,排序后的结果应满足:\ $\quad$ 1. 排序后的结果应满足 $a_{i} \le n$,且 $i$ 至多出现一次;\ $\quad$ 2. 对于下标 $i$ 和 $j$,若有 $i \le j$,则从图中 $i$ 号点必不能走到 $j$ 号点(路径长度至少为 $1$)。\ $\quad$ 3. 对于一个点 $i$,它在序中的充要条件是其所有父亲结点均在序中。\ 满足以上条件的排序结果被称为拓扑序,排序过程被称为拓扑排序。现在给定有向图 $\mathbf{G}$,请输出该图的最长拓扑序。 如果最长拓扑序不止一种,请输出**字典序最小**的一种。**注意图中可能存在重边及自环**。

输入格式

共 $m+1$ 行。\ 第一行两个整数 $n$ 和 $m$,表示节点个数、边的个数。\ 之后的 $m$ 行,第 $i$ 行两个整数 $a_{i}$ 和 $b_{i}$,表示 $a_{i}$ 到 $b_{i}$ 之间有边。

输出格式

两行。\ 第一行一个整数 $v$,代表最长拓扑序的长度。\ 第二行 $v$ 个整数 $topo_{i}$,代表字典序最小的最长拓扑序。

说明/提示

$【样例解释】$\ 对于拓扑序 $1\ 2\ 3$,满足题目所给条件;\ $4$ 号节点因其自环,不在拓扑序中。 $【数据范围】$\ 对于 $20\%$ 的数据,$n \le 10^{3}$,$m \le 2 \times 10^{3}$;\ 对于 $100\%$ 的数据,$n \le 10^{6}$,$m \le 2 \times 10^{6}$。