此题为裸的欧拉回路。
题目大意:求字典序最小的欧拉回路
题目说保证有解,所以我们不用在意↙
所有点的度为偶数 (判欧拉回路的存在)
度为奇数的点=2,存在一条欧拉路
度为奇数的点>2,不存在欧拉路
我们只需每次选一个度为奇数的点为起点找欧拉回路。
PS:要求字典序最小
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
int n,ma=0,a[510][510],t[510],road[1030],tot=0;
inline int read()
{
int x=0; char c=getchar();
while (c<'0' || c>'9') c=getchar();
while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x;
}
void dg(int x)
{
for(int i=1;i<=ma;i++)
if(a[x][i]) a[x][i]--,a[i][x]--,dg(i);
road[++tot]=x;
}
void euler()
{
for(int i=1;i<=ma;i++)
if(t[i]%2) {dg(i); return;}
dg(1);
}
int main()
{
n=read();
for(int i=1,u,v;i<=n;i++)
{
u=read(),v=read();
a[u][v]++,a[v][u]++;
t[u]++,t[v]++;
if (u>ma) ma=u;
if (v>ma) ma=v;
}
euler();
for(int i=tot;i>0;i--)
printf("%d
",road[i]);
return 0;
}