基本思想:
- 由于每条边只经过一次,遍历并删边即可.
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN=2e5,MAXM=2e5; struct Edge{ int from,to,nxt; }e[MAXM]; int head[MAXN],edgeCnt=1; void addEdge(int u,int v){ e[++edgeCnt].from=u; e[edgeCnt].to=v; e[edgeCnt].nxt=head[u]; head[u]=edgeCnt; } int stack[MAXN], ans[MAXN]; // 模拟系统栈,答案栈 bool vis[MAXN]; int top,t; void euler() { stack[++top] = 1; while (top) { int x = stack[top], i = head[x]; while (i && vis[i]) i = e[i].nxt; if (i) { stack[++top] = e[i].to; head[x] = e[i].nxt; vis[i]=vis[i^1]=1; }else{ top--; ans[++t] = x; } } } int main() { int n,m; scanf("%d%d",&n,&m); for (int i = 1; i <= m; i++) { int u,v; scanf("%d%d",&u,&v); addEdge(u,v); addEdge(v,u); } euler(); for (int i = 1; i<=t; i++) printf("%d ", ans[i]); return 0; }