思路:
输出欧拉回路的路径。
对于存在欧拉回路的图,只需要对一条边深搜,搜到不能搜为止,容易证明终点一定是欧拉回路的起点。
代码:
#include<stdio.h>
#include<string.h>
const int N = 10001;
const int M = 50005;
struct Edge{
int u;
int v;
int next;
}edge[2 * M];
int head[N+1];
bool use[2*M+1];
int stk[2*M+5],top;
int n,m,e;
void addedge(int u , int v){
edge[e].u = u;
edge[e].v = v;
edge[e].next = head[u];
head[u] = e++;
return ;
}
void dfs(int v){
for(int i = head[v] ; i != -1 ; i = edge[i].next){
if(!use[i]){
use[i] = 1;
dfs(edge[i].v);
stk[top ++] = i;
}
}
return ;
}
int main(){
int a , b;
while(~scanf("%d%d" , &n , &m)){
e = 0;
memset(use , 0 , sizeof(use));
memset(head,-1,sizeof(head));
top = 0;
for(int i = 0 ; i < m ; i ++){
scanf("%d%d" , &a , &b);
addedge(a , b);
addedge(b , a);
}
dfs(1);
top --;
for(int i = 0 ; i < top ; i++)
printf("%d\n" , edge[stk[i]].v);
printf("%d\n%d\n",edge[stk[top]].v,edge[stk[top]].u);
}
return 0;
}