照着双笙题解校对了好久
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
struct edge{
int to,bot;
}e[1000005];
int head[500005],ecnt=0;
inline void add_edge(int u, int v){
e[++ecnt].to=v;
e[ecnt].bot=head[u];
head[u]=ecnt;
return ;
}
int in;
bool inloop[500005],vis[500005];
void dfs_loop(int now, int fa){
vis[now]=true;
for (int i=head[now];i;i=e[i].bot){
int nxt=e[i].to;
if (nxt!=fa){
if (vis[nxt] && !in){
inloop[now]=true;
in=nxt;
return ;
}
if (!vis[nxt]){
dfs_loop(nxt,now);
if (in==nxt){
return ;
}
if (inloop[nxt]){
inloop[now]=true;
return ;
}
}else return ;
}
}
return ;
}
queue<int> ans;
bool bf[500005],flag=false;
void dfs_ans(int now, int fa, int rt){
ans.push(now);
bf[now]=true;
priority_queue<int, vector<int>, greater<int> > tmp;
while (!tmp.empty()) tmp.pop();
for (int i=head[now];i;i=e[i].bot){
int nxt=e[i].to;
if (nxt!=fa) tmp.push(nxt);
}
while (!tmp.empty()){
int nxt=tmp.top();
tmp.pop();
if (bf[nxt]) continue;
if (!flag && inloop[now] && rt<nxt && tmp.empty()){
flag=true;
return ;
}
int udt=0;
if (!flag && !tmp.empty() && inloop[now] && inloop[nxt]) udt=tmp.top();
dfs_ans(nxt,now,(udt?udt:rt));
}
return ;
}
int n,m;
int main(){
memset(head,0,sizeof(head));
memset(bf,false,sizeof(bf));
memset(vis,false,sizeof(vis));
memset(inloop,false,sizeof(inloop));
scanf("%d%d",&n,&m);
int u,v;
for (int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
add_edge(u,v);
add_edge(v,u);
}
if (m==n) dfs_loop(1,0);
dfs_ans(1,0,1e9);
while (!ans.empty()){
printf("%d ",ans.front());
ans.pop();
}
return 0;
}