难点 1 1 1:输出字典序最小的解。
结论:只要按照字典序顺序搜索,一定是字典序最小的解。
难点 2 2 2:有重边。
方法:记录一下每一条边出现的次数即可。
#include <bits/stdc++.h>
using namespace std;
const int N = 2500;
int n, m;
int z[N][N], ans[N], idx, deg[N];
void dfs(int u)
{
for (int i = 1; i <= n; i ++)
if (z[u][i])
{
z[u][i] --, z[i][u] --;
dfs(i);
}
ans[++ idx] = u;
}
int main()
{
cin >> m;
while (m --)
{
int a, b;
cin >> a >> b;
z[a][b] ++, z[b][a] ++;
deg[a] ++, deg[b] ++;
}
n = 666;
int root = 1;
for (; root <= n; root ++)
if (deg[root] & 1)
break;
if (root == n + 1)
for (root = 1; root <= n; root ++)
if (deg[root])
break;
dfs(root);
for (int i = idx; i; i --)
cout << ans[i] << '\n';
return 0;
}