一些观察
首先考虑 tarjan 缩点,如果存在一二类点当且仅当这个 DAG 只有一个入度为 的点且一二类点必定在其中。(假设这个块是 )
如果不存在一类点, 里面的点就全是二类点。
横叉边、前向边很烦,但是如果确定一个一类点之后以它为根就只有树边和返祖边了。
所以大致做法可以分成两部分,找出一个一类点和确定剩下的一二类点。
注意到只要存在一类点, 以外的点和边都可以不考虑(如果 判断一个点是否是一类点的代价能接受)。
讨论范围缩小到 ,因为是一个强连通分量,所以任选一个点作为根所有点都可以走到它。