RT,思路就是走到一个环,分两种情况,走左边就记录下右边,当走到某一个位置比右边的值大则跳到右边。
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int const N=1e6+10;int v[N],s[N],tag=0,top,vis[N],co[N],ans[N],k;
vector<int>a[N];int la=-1;
inline void findhuan(int x,int fa){
s[++top]=x;vis[x]=1;
if (tag) return;
for (auto v:a[x]){
if (tag) return;
if (v!=fa){
if (vis[v]){
int k=top;
while (1){
int X=s[k];co[s[k--]]=1;
if (k<0) break;
// cout<<k<<' '<<X<<' '<<v<<'\n';
if (X==v){tag=1;return;}
}
}else findhuan(v,x);
}
}
top--;
}
inline void dfs(int x){
ans[++k]=x;vis[x]=1;
// cout<<x<<'\n';
sort(a[x].begin(),a[x].end());
// cout<<a[x].size()<<'\n';
int st=0;while (st<a[x].size() && vis[a[x][st]]) ++st;//,cout<<st<<'\n';
// --st;if (st<0) ++st;
if (st==a[x].size()) return;
// cout<<x<<' '<<st<<' '<<a[x][st]<<' '<<co[x]<<'\n';
if (co[x] && la!=-1 && la<a[x][st] && !vis[la]) dfs(la);
if (co[x] && la==-1){
int tag=0;
for (auto v:a[x]){if (co[v]){tag=v;break;}}
for (auto v:a[x]) if (co[v] && v!=tag) la=v;
}
for (auto v:a[x]) if (!vis[v]) dfs(v);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n,m;cin>>n>>m;
while (m--){
int u,v;cin>>u>>v;
a[u].push_back(v);a[v].push_back(u);
}
findhuan(1,-1);
memset(vis,0,sizeof(vis));
// cout<<"1\n";
// for (int i=1;i<=n;++i) cout<<co[i]<<' ';
// cout<<'\n';
dfs(1);
for (int i=1;i<=n;++i) cout<<ans[i]<<' ';
cout<<'\n';
return 0;
}