题目:https://www.acwing.com/problem/content/1126/
题意:给一个无向图,点的编号最多为500,边数最多为1024,首先输入一个m代表边的数量,然后让输出字典序最小的欧拉路径(字典序最小—经过点的编号字典序最小)。题目保证至少有一个欧拉路径。
题解:搜索的时候,从编号小的点开始搜即可。
#include <bits/stdc++.h>
//#define int long long
#define pb push_back
#define pii pair<int, int>
#define mpr make_pair
#define ms(a, b) memset((a), (b), sizeof(a))
#define x first
#define y second
typedef long long ll;
typedef unsigned long long LL;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
using namespace std;
inline int read() {
char ch = getchar();
int s = 0, w = 1;
while (ch < '0' || ch > '9') {
if (ch == '-') w = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
s = s * 10 + ch - '0', ch = getchar();
}
return s * w;
}
const int N = 1e6+9;
int n=500,m;
int ma[502][502];
int ans[1100],cnt;
int d[502];
void dfs(int u){
//从小的点开始搜
for(int i=1;i<=n;i++){
if(ma[u][i]){
//删边
ma[u][i]--,ma[i][u]--;
dfs(i);
}
}
ans[++cnt]=u;
}
signed main() {
scanf("%d",&m);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
ma[u][v]++,ma[v][u]++;
d[u]++,d[v]++;
}
int start=1; //找到一个有度数的点
while(d[start]==0)start++;
for(int i=1;i<=n;i++){
if(d[i]%2){ //如果有奇数点,从奇数点开始搜
start=i;
break;
}
}
dfs(start);
for(int i=cnt;i>=1;i--)printf("%d\n",ans[i]);
return 0;
}