无向图有欧拉通路的前提:
1.为连通图
2.奇度顶点为0或者2
#include<iostream>
using namespace std;
#include<set>
#define N 10005
#define M 100005
set<int> g[N]; //set特性 从小到大
int sum_odd;
int ans[M];
int n,m;
int top; //模拟栈
int fa[N];
void dfs(int u)
{
while(g[u].size())
{
int v=*g[u].begin(); //g[u].begin 返回指针
g[u].erase(v); //删除边
g[v].erase(u);
dfs(v); //深搜
}
ans[top++]=u; //度数为0的点进栈
}
void init() //初始化fa数组
{
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
}
int find(int x)
{
if(fa[x]!=x)
{
fa[x]=find(fa[x]);
}
return fa[x];
}
int main()
{
cin>>n>>m;
init();
int u,v;
for(int i=0;i<m;i++)
{
scanf("%d %d",&u,&v);
g[u].insert(v);
g[v].insert(u);
if(find(u)!=find(v))
{
fa[find(u)]=find(v);
}
}
int c=find(1);
for(int i=2;i<=n;i++) //首先判断是否构成连通图
{
if(find(i)!=c)
{
cout<<-1;
return 0;
}
}
for(int i=1;i<=n;i++) //计算奇数顶点的个数
{
if(g[i].size()%2)
sum_odd++;
}
if(!sum_odd || (sum_odd==2 && g[1].size() %2==1)) //奇数顶点为0 或者 奇数顶点为2个且顶点1为奇数顶点
{
dfs(1);
for(int i=top-1;i>=0;i--) //栈输出
{
printf("%d ",ans[i]);
}
}
else {
cout<<-1;
}
return 0;
}