以下代码改自题解
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i<=k;++i)
using namespace std;
const int MAXN=5e5+78;
bool vis[MAXN],huan[MAXN],fl;
vector<int> ver[MAXN];
int n,m;
int mx=MAXN,alf;
inline void read(int &x)
{
x=0;
register char ch=getchar();
while(ch>'9'||ch<'0')
{
ch=getchar();
}
while (ch>='0'&&ch<='9')
{
x=x*10+ch-48;
ch=getchar();
}
}
inline void dfs1(int x,int fa)
{
printf("%d ",x);
rep(i,0,ver[x].size()-1)
{
int y(ver[x][i]);
if(y==fa)continue;
dfs1(y,x);
}
}
stack<int> s;
void dfs_huan(int x,int fa)
{
if(fl)return ;
vis[x]=1;
s.push(x);
rep(i,0,ver[x].size()-1)
{
int y(ver[x][i]);
if(y==fa)continue;
if(vis[y])
{
huan[y]=1;
while(s.size()&&s.top()!=y)
huan[s.top()]=1,s.pop();
fl=1;
return ;
}
dfs_huan(y,x);
// if(fl) return;
}
// s.pop();
}
void dfs2(int x,int fa)
{
vis[x]=1;
printf("%d ",x);
rep(i,0,ver[x].size()-1)
{
int y(ver[x][i]);
if(vis[y])continue;
if(!huan[y])dfs2(y,x);
else
{
if(!alf)
{
int t=( (i==ver[x].size()-1) ? mx:ver[x][i+1] );
if(t==fa) mx=((i==ver[x].size()-2)?mx:ver[x][i+2] );
else mx=t;
}
if(mx<y&&!alf)
{
alf=1;
continue;
}
else dfs2(y,x);
}
}
}
int main()
{
// freopen("travel.in","r",stdin);
// freopen("travel.out","w",stdout);
read(n);
read(m);
int x,y;
rep(i,1,m)
{
read(x);
read(y);
ver[y].push_back(x);
ver[x].push_back(y);
}
rep(i,1,n) sort(ver[i].begin(),ver[i].end());
if(m==n-1)dfs1(1,0);
else
{
dfs_huan(1,0);
memset(vis,0,sizeof(vis));
dfs2(1,0);
}
return 0;
}
第59行,可以不弹出吧,事实证明76分WA 第567行,这句话我觉得没必要吧,影响不大,事实证明60分RE