POJ 2230 欧拉回路
xg
测板子
#include <iostream> #include <cmath> #include <cstdio> #include <cstring> #include <string> #include <map> #include <iomanip> #include <algorithm> #include <queue> #include <stack> #include <set> #include <vector> #define bug cout<<"--------------"<<endl #define sp ' ' using namespace std; typedef long long ll; const int maxn = 1e4+10; const int maxm = 1e5+10; int tot = 0; int head[maxm],ver[maxm],edge[maxm],nextt[maxm]; void add(int x,int y) { ver[++tot] = y,nextt[tot] = head[x] , head[x] = tot; } int sta[1000010],ans[1000010],vis[1000010]; int n,m,top,t; void euler() { sta[++top] = 1; while(top > 0) { int x = sta[top], i = head[x]; //while(i && vis[i]) i = Next[i]; //找到一条尚未访问过的边 if(i) { sta[++top] = ver[i]; //vis[i] = vis[i ^ 1] = true; head[x] = nextt[i]; }else{ //x连接的所有边都已经访问过了,回溯,级在答案栈中 top--; ans[++t] = x; } } } int main() { //freopen("input.txt", "r", stdin); scanf("%d%d", &n, &m); tot = 1; int x, y; for(int i = 0; i < m; ++i) { scanf("%d%d", &x, &y); add(x, y); add(y, x); } euler(); for(int i = t; i; --i) { printf("%d\n", ans[i]); } return 0; }