## [$POJ$ $1041$ $John's$ $trip$](http://poj.org/problem?id=1041)
### 一、题目大意
多组数据,输入$x,y,z$,表示结点$x$和结点$y$之间有一条序号为$z$的边,如果这个 **无向图** 中存在欧拉回路,就 **输出字典序最小的欧拉回路**,如果不存在欧拉回路就输出 `Round trip does not exist. `。当输入`0 0`表示一组数据输入结束,题目保证了图的连通性。
给出一张无向图,要求从起点开始遍历一遍所有的边,最后再回到起点,题目要求输出任意一组方案
#### 细节
- 起点不是点$1$,而是第一条边中两个端点中较小的一个点
- 给出的$x$ $y$ $z$代表的是点$x$到点$y$由$id$为$z$的边连接
- 最后答案要求输出的是边的$id$
### 二、解题思路
#### 欧拉回路
对于一个图可以从一个顶点沿着边走下去,每个边只走一次,所有的边都经过后回到原点的路。
#### 欧拉回路判定
- 无向图存在欧拉回路 $\Leftrightarrow$ 每个顶点的度是偶数
- 有向图存在欧拉回路 $\Leftrightarrow$ 每个顶点的出度等于入度(就是出去的边数等于进来的边数)
#### 解题步骤
先根据欧拉路的定义判断是否存在欧拉路,如果存在的话再 **求字典序最小的欧拉路**,一定是以边$1$为起始的欧拉路,然后将每个结点的边按序号从大到小排序,从而保证$dfs$的时候得到的是字典序最小的欧拉路。
> **解释**:链式前向星是与$dfs$配合的,栈的原理,由大到小排序,最后走的就是小的,反着打出来就是由小到大
### 三、$do \ while$版本
```cpp {.line-numbers}
#include
#include
#include
#include
#include
#include
#include
#include
#include