#P9158. 有向图环检测(Cycle Detection (Directed))

有向图环检测(Cycle Detection (Directed))

有向图环检测(Cycle Detection (Directed))

问题描述

给你一个含 N N 个顶点、M M 条边的有向图。第 i i 条边从顶点 ui u_i 指向顶点 vi v_i
请找出一个边不相交的环(edge-disjoint cycle),并输出该环;若不存在任何环,输出 -1要换行)。

注:题目要求“edge-disjoint cycle”但仅需输出一个环,且说明“若有多个,任选其一”,因此此处“edge-disjoint”应理解为单个环内部边互不重复(即简单环),而非多个环之间边不相交。标准解释为:输出任意一个简单有向环即可。

约束条件

  • 2N5×105 2 \leq N \leq 5 \times 10^5
  • 1M5×105 1 \leq M \leq 5 \times 10^5
  • 0ui,vi<N 0 \leq u_i, v_i < N
  • uivi u_i \ne v_i

输入格式

N MN\ M
u0 v0u_0\ v_0
u1 v1u_1\ v_1
:
uM1 vM1u_{M-1}\ v_{M-1}

输出格式

  • 若无环:

    -1

  • 否则:

    LL
    e0e_0
    e1e_1
    :
    eL1e_{L-1}

其中:

  • L L 是环中边的数量;
  • ei e_i 是环中第 i i 条边的编号(0 0 -based),满足 e0,e1,,eL1 e_0, e_1, \dots, e_{L-1} 构成一个有向环(即 vei=uei+1 v_{e_i} = u_{e_{i+1}} ,下标模 L L )。
5 7
0 3
0 4
4 2
4 3
4 0
2 1
1 0
4
1
2
5
6

For instance, L=2L=2, e=(1,4)e=(1,4) is also a valid answer.

2 1
1 0
-1
4 6
0 1
1 2
2 0
0 1
1 3
3 0
3
0
1
2

Any edge-disjoint cycles (so it satisfies the rule: eieje_i \ne e_j) can get accepted, so L=6L=6, e=(0,1,2,3,4,5)e=(0,1,2,3,4,5) is also a valid answer. Note that L=6L=6, e=(0,1,2,0,4,5)e=(0,1,2,0,4,5) is not a valid answer.