思路是先找环再dfs,调了好久还是WA一个点,求助,求hack
#include <bits/stdc++.h>
#define int long long
#define MAXN 1000010
#define INF 1000000000000000
using namespace std;
int n,m,u,v,vis[MAXN],sta[MAXN],top,inr[MAXN],flag,sz;
int inround,t,tt;
vector<int> p[MAXN];
void dfsTree(int x,int fa)
{
cout<<x<<" ";
for(int i=0;i<p[x].size();i++)
if(p[x][i]!=fa)
dfsTree(p[x][i],x);
}
void dfsFind(int x,int fa)
{
//cout<<x<<endl;
if(vis[x]&&!flag)
{
flag=1;
inr[x]=1; int tmp=sta[top-1];
while(tmp!=x)
{
inr[tmp]=1;
--top;
tmp=sta[top-1];
}
return;
}
else if(vis[x]) return;
vis[x]=1;
sta[top++]=x;
for(int i=0;i<p[x].size();i++)
if(p[x][i]!=fa)
dfsFind(p[x][i],x);
--top;
}
void dfs(int x,int fa,int mxt)
{
cout<<x<<" ";
vis[x]=1;
if(++sz==n) return;
if(inr[x]&&!flag)
{
if(!t) t=x;
inround=1;
for(int i=0;i<p[x].size();i++)
if(p[x][i]!=fa&&!vis[p[x][i]])
{
if(!inr[p[x][i]])
dfs(p[x][i],x,mxt);
else
{
if(p[x][i]>mxt)
{
flag=1;
return;
}
int ttmp=(int)(p[x].size())-1;
if(i==ttmp) dfs(p[x][i],x,mxt);
else if(p[x][i+1]==fa||vis[p[x][i+1]])
{
if(i+2<=ttmp) dfs(p[x][i],x,p[x][i+2]);
else dfs(p[x][i],x,mxt);
}
else dfs(p[x][i],x,p[x][i+1]);
}
}
}
else
for(int i=0;i<p[x].size();i++)
if(p[x][i]!=fa&&!vis[p[x][i]])
dfs(p[x][i],x,mxt);
}
signed main()
{
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
p[u].push_back(v);
p[v].push_back(u);
}
for(int i=1;i<=n;i++) sort(p[i].begin(),p[i].end());
if(m==n-1)
dfsTree(1,0);
else
{
dfsFind(1,0);
//for(int i=1;i<=n;i++) if(inr[i]) cout<<i<<" ";
//cout<<endl;
memset(vis,0,sizeof(vis));
flag=0;
dfs(1,0,INF);
}
return 0;
}