#oLHLybttg030701. 1527:【例 1】欧拉回路
1527:【例 1】欧拉回路
1527:【例 1】欧拉回路
题目描述
有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。
一共两个子任务:
- 这张图是无向图。(50 分)
- 这张图是有向图。(50 分)
输入格式
第一行一个整数 ,表示子任务编号。,如果 则表示处理无向图的情况,如果 则表示处理有向图的情况。
第二行两个整数 ,表示图的结点数和边数。
接下来 行中,第 行两个整数 ,表示第 条边(从 开始编号)。保证 。
- 如果 则表示 到 有一条无向边。
- 如果 则表示 到 有一条有向边。
图中可能有重边也可能有自环。
输出格式
如果不可以一笔画,输出一行 NO。
否则,输出一行 YES,接下来一行输出一组方案。
- 如果 ,输出 个整数 。令 ,那么 表示经过的第 条边的编号。如果 为正数表示从 走到 ,否则表示从 走到 。
- 如果 ,输出 个整数 。其中 表示经过的第 条边的编号。
样例
样例输入 #1(无向图)
1
3 3
1 2
2 3
1 3
样例输出 #1
YES
1 2 -3
样例解释 #1
- 表示无向图。
- 。
- 边:
- 该图存在欧拉回路(每个顶点的度数为偶数)。
- 输出方案:
1 2 -3- 第一步走第 条边,从 到 (因为 ,表示从 到 )。
- 第二步走第 条边,从 到 (,从 到 )。
- 第三步走第 条边,从 到 (,表示从 到 ?注意:对于无向边, 和 没有方向,但输出中 为正表示从 到 ,为负表示从 到 )。这里 表示从 到 ,即从 到 。但此时 是起点吗?实际上回路是 ,所以第三步是从 到 ,符合。
- 回路为:。
样例输入 #2(有向图)
2
5 6
2 3
2 5
3 4
1 2
4 2
5 1
样例输出 #2
YES
4 1 3 5 2 6
样例解释 #2
- 表示有向图。
- 。
- 有向边:
- 该有向图存在欧拉回路(每个顶点的入度等于出度)。
- 输出方案:
4 1 3 5 2 6- 表示依次经过边 。
- 回路为:。
数据范围
时空限制
- 时间限制:1000 ms
- 内存限制:262144 KB
注意:本题要求输出欧拉回路的边的顺序。需要判断欧拉回路存在的条件:
- 无向图:所有顶点的度数均为偶数,且所有边属于同一个连通分量(忽略孤立点)。
- 有向图:所有顶点的入度等于出度,且所有边属于同一个弱连通分量(忽略孤立点)。
使用 Hierholzer 算法求欧拉回路,注意删除已访问的边(因为 较大,可以用邻接表加删除标记或动态删除边)。对于无向图,每条边需要拆成两个方向,并注意输出时标记边的方向(正负号)。注意自环和重边的处理。