这是一道模板题
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2000;
int m,tot = 0,top = 0,n = 0,flag = 0,u = 501;
bool v[maxn],vv[maxn];
int d[505];
int e[505][505];
stack<int > s;
inline void dfs (int x) {
for (int i=1;i<=500;++i) {//题目中说要求字典序最小,这个由于是从1到n来遍历所以自然结果最小
if (e[x][i] != 0)
{
e[x][i]--;
e[i][x]--;//建的是双向边,防止回来时重复走同一边
dfs(i);
}
}
s.push(x);//>>>>按照便利顺序,我们是反向进的栈
}
inline int Read() {
int xx = 0;
int ff = 1;
char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') {
ff = -1;
}
ch = getchar();
}
while (isdigit(ch)) {
xx = xx * 10 + ch - '0';
ch = getchar();
}
return xx * ff;
}
int main () {
memset(vv,0,sizeof(vv));
memset(d,0,sizeof(d));
memset(v,0,sizeof(v));
memset(e,0,sizeof(e));
m = Read();
for (int i = 1;i <= m;i++) {
int x = Read(); int y = Read();
e[x][y]++; e[y][x]++;
if (vv[x] == 0) n++,vv[x] = 1;
if (vv[y] == 0) n++,vv[y] = 1;
d[x]++;
d[y]++;
}
for (int i = 1;i <= 500;i++) {
if (d[i] % 2 == 1){
dfs(i);
flag = 1;
break;
}
if (d[i] != 0&&d[i] %2 != 1&&i < u) {
u = i;
}
}
if (flag == 0) dfs(u);
while (!s.empty()) {
cout << s.top() <<endl;//这里其实是反向输出,但是,看这里>>>>>>
s.pop();
}
return 0;
}