无向图的欧拉路经,并且输出字典序最小的方案。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
bool vis[maxn][maxn];
vector<int>G[maxn];
int n, m;
int d[maxn];
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
int u, v;
for(int i=1; i<=m; i++){
cin>>u>>v;
G[u].push_back(v), G[v].push_back(u);
d[u]++, d[v]++;
}
int odd = 0;
for(int i=1; i<=n; i++) {
if(d[i]&1) odd++;
sort(G[i].begin(), G[i].end());
}
stack<int> st;
st.push(1);
vector<int> ans;
while(!st.empty()){
int u = st.top();
bool flag = false;
for(int i=0; i<G[u].size(); i++){
int v = G[u][i];
if(!vis[u][v]){
vis[u][v] = vis[v][u] = true;
flag = true;
st.push(v);
break;
}
}
if(!flag){
ans.push_back(u);
st.pop();
}
}
if(ans.size() == m+1 &&(odd == 0||(odd == 2 &&(d[1]&1)))){
int sz = ans.size();
cout<<ans[sz-1];
for(int i=sz-2; i>=0; i--){
cout<<" "<<ans[i];
}
cout<<endl;
}
else cout<<-1<<endl;
return 0;
}