求一条欧拉回路的方法,每次移动前向星的head,避免变成O(N*M),这样就变成O(N+M)了
#include<cstdio>
#include<algorithm>
#define maxl 50010
using namespace std;
int n,m,top,cnt;
int ehead[maxl],s[maxl*2],ans[maxl*2];
struct ed
{
int to,nxt;
}e[maxl*2];
bool vis[maxl*2];
inline void add(int u,int v)
{
e[++cnt].to=v;e[cnt].nxt=ehead[u];
ehead[u]=cnt;vis[cnt]=false;
}
inline void prework()
{
for(int i=1;i<=n;i++)
ehead[i]=0;
int u,v;cnt=1;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
}
inline void euler()
{
s[++top]=1;
while(top>0)
{
int u=s[top],i=ehead[u];
while(i && vis[i]) i=e[i].nxt;
if(i)
{
s[++top]=e[i].to;
//vis[i]=vis[i^1]=true;
//如果每条边走一次而不是正反各走一次则去掉注释
ehead[u]=e[i].nxt;
}
else
{
top--;
ans[++ans[0]]=u;
}
}
}
inline void mainwork()
{
ans[0]=0;
euler();
}
inline void print()
{
for(int i=ans[0];i>=1;i--)
printf("%d\n",ans[i]);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
prework();
mainwork();
print();
}
return 0;
}