#P9168. 有向图欧拉迹(Eulerian Trail (Directed))

有向图欧拉迹(Eulerian Trail (Directed))

有向图欧拉迹(Eulerian Trail (Directed))

问题描述

给定 T T 组测试数据。对每组,输入一个含 N N 个顶点、M M 条边的有向图(边按输入顺序编号为 0 0 M1 M-1 )。
判断该图是否存在欧拉迹(Eulerian trail)——即一条经过每条边恰好一次的路径(不要求回到起点)。

若存在,输出任意一条欧拉迹,格式为:

  • 第一行:Yes
  • 第二行:顶点序列 v0,v1,,vM v_0, v_1, \dots, v_M (长度 M+1 M+1
  • 第三行:边序列 e0,e1,,eM1 e_0, e_1, \dots, e_{M-1} (长度 M M ),其中 ei e_i 是路径中第 i i 条边的编号,且满足:
    • e0,,eM1 e_0, \dots, e_{M-1} {0,1,,M1} \{0,1,\dots,M-1\} 的一个排列;
    • 对每个 i i ,边 ei e_i vi v_i 指向 vi+1 v_{i+1}

若不存在,输出 No

存在性条件(有向图)

图存在欧拉迹当且仅当满足以下之一:

  1. 欧拉回路:所有顶点入度 = 出度,且图弱连通(忽略方向后连通)且至少有一条边;
  2. 欧拉路径(非回路):恰有一个顶点满足 outdegindeg=1 \text{outdeg} - \text{indeg} = 1 (起点),恰有一个顶点满足 indegoutdeg=1 \text{indeg} - \text{outdeg} = 1 (终点),其余顶点入度 = 出度,且图弱连通且至少有一条边。

注意:孤立顶点(入出度均为 0)允许存在,但整个图必须在边诱导子图上弱连通(即所有有边的顶点构成一个弱连通分量)。

约束条件

  • 1T105 1 \leq T \leq 10^5
  • 1N2×105 1 \leq N \leq 2 \times 10^5
  • 1M2×105 1 \leq M \leq 2 \times 10^5
  • 所有测试用例中 N2×105 \sum N \leq 2 \times 10^5 M2×105 \sum M \leq 2 \times 10^5

输入格式

TT
N MN\ M
u0 v0u_0\ v_0
u1 v1u_1\ v_1
:
uM1 vM1u_{M-1}\ v_{M-1}
(重复 T T 组)

输出格式

  • 若无欧拉迹:

    No

  • 否则:

    Yes
    v0 v1  vMv_0\ v_1\ \cdots\ v_M
    e0 e1  eM1e_0\ e_1\ \cdots\ e_{M-1}

3
4 7
0 1
2 0
0 2
3 0
1 3
2 3
3 3
4 6
0 1
2 0
0 3
1 2
3 1
2 3
6 10
0 3
1 2
4 0
5 1
4 4
2 3
3 1
3 2
1 4
1 5
Yes
2 0 1 3 0 2 3 3
1 0 4 3 2 5 6
No
Yes
1 2 3 1 5 1 4 4 0 3 2
1 5 6 9 3 8 4 2 0 7
6
10 0
10 1
0 1
10 1
4 4
10 2
4 4
5 5
10 2
3 6
6 3
10 2
3 6
3 6
Yes
0

Yes
0 1
0
Yes
4 4
0
No
Yes
3 6 3
0 1
No