欧拉回路
算法概况:书本上原理的实现
时间复杂度:O(n+m)

#include<iostream>
using namespace std;
int head[100010],ver[1000010],Next[1000010],tot;
int stack[1000010],ans[1000010];
bool vis[1000010];
int n,m,top,t;
void add(int x,int y){
    ver[++tot]=y,Next[tot]=head[x],head[x]=tot;
}
void euler(){
    stack[++top]=1;
    while(top>0){
        int x=stack[top],i=head[x];
        while(i&&vis[i])    i=Next[i];
        if(i){
            stack[++top]=ver[i];
            vis[i]=vis[i^1]=true;
            head[x]=Next[i];
        }
        else{
            top--;
            ans[++t]=x;
        }
    }
}
int main(){
    cin>>n>>m;
    tot=1;
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    euler();
    for(int i=t;i;i--)    printf("%d\n",ans[i]);
    return 0;
}

测试数据

7 9
1 2
1 3
2 3
1 4
1 5
4 5
5 6
5 7
6 7