算法思路:1.欧拉回路都是偶点,无奇点
2.欧拉路只有两个奇点(起点和终点),其余都是偶点
3.给定样例数据一定存在两者之中的一种
4.欧拉路包括欧拉回路

#include<iostream>
using namespace std;
void CircleDFS(int a);
int m,n;//m为点数,n为边数
bool graph[1000][1000];//邻阶矩阵
int nodedu[1000];//节点的度(用于判断是奇点还是偶点)
int passed[1000];// 记录路径
int numbe;//路径Node数量
int main() {
    cin>>m>>n;
    for(int i=1; i<=n; i++) {
        int a,b;
        cin>>a>>b;
        graph[a][b]=true;//存储到邻接矩阵
        graph[b][a]=true;
        nodedu[a]++;//统计节点度
        nodedu[b]++;
    }
    int start;//search初始点
    for(int i=1; i<=n; i++) {
        if(nodedu[i]%2!=0) {
            start=i;//发现奇点
            break;
        }
    }
    CircleDFS(start);//有基点找路,无基点找环
    //cout<<numbe<<endl;
    for(int i=1; i<=numbe; i++)
        cout<<passed[i]<<" ";

    return 0;
}
void CircleDFS(int a) { //从a节点开始搜索
    for(int i=1; i<=n; i++) {
        if(graph[a][i]==true) { //有路径
            graph[a][i]=false;//如果走到了,删除节点避免重复
            //如果没有走到,则说明这个点开始永远不可能走到,则断开路径,避免重复 
            graph[i][a]=false;
            CircleDFS(i);//如果走到无法再走(没有路径)的时候返回
            /*无路径即已经走到尾 :
            证明:上已有如果该点开始走不到(或已经走过)结尾,则该点通路断开,则连接的是可以到达或没有实验的
            此时没有通路,则说明已到达结尾 
            */ 
        }
    }
    numbe++;
    passed[numbe]=a;//递归归时统计路径,不必像递时POP元素(况且图的走法顺序不限) 

}