这里学习了一个新算法,专门用来求解欧拉路的,回路和路径都可以。按照hihocoder给的思路,我给出了我的具体实现,时间复杂度 O(m) O ( m ) :
#include<iostream>
#include<cstdio>
#include<stack>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#define maxn 1005
#define maxx 5005
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
int n,m;
int head[maxn],_next[maxx<<1],to[maxx<<1];
bool vis[maxx<<1];
int edge=1;
void addEdge(int x,int y)
{
to[++edge]=y,_next[edge]=head[x],head[x]=edge;
to[++edge]=x,_next[edge]=head[y],head[y]=edge;
}
stack<int> st;
void dfs(int u)
{
for(int i=head[u];i;i=_next[i])
{
if(vis[i])continue;
vis[i]=vis[i^1]=true;
st.push(to[i]);
dfs(to[i]);
break;
}
}
void fleury(int r)
{
st.push(r);
while(st.size())
{
bool sign=true;
int u=st.top();
for(int i=head[u];i;i=_next[i])
{
if(vis[i])continue;
sign=false;
vis[i]=vis[i^1]=true;
st.push(to[i]);
dfs(to[i]);
break;
}
if(sign)
{
if(st.size()==1)
printf("%d",st.top());
else printf("%d ",st.top());
st.pop();
}
}
}
int deg[maxn];
int main()
{
cin>>n>>m;
int x,y;
for(int i=0;i<m;++i)
{
scanf("%d%d",&x,&y);
addEdge(x,y);
++deg[x],++deg[y];
}
bool sign=false;
int r;
for(int i=1;i<=n;i++)
if(deg[i]&1)
{
r=i;
sign=true;
break;
}
if(sign)fleury(r);
else fleury(1);
return 0;
}