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}$。