集训·旅行(增强版?)

#include<bits/stdc++.h>
using namespace std;
const int N=500005;
int n,m,u,v,fa[N],tmp=0x3f3f3f3f;
bool can,ring[N],vis[N],huis;
vector<int> mp[N];
inline void dfsshu(int x)
{
	vis[x]=true;cout<<x<<" ";
	for(int i=0;i<mp[x].size();i++)
	{
		int nex=mp[x][i];
		if(!vis[nex])dfsshu(nex);
	}
}
inline void get_ring(int now,int pre)
{
	if(can)return;
	if(!fa[now])fa[now]=pre;
	else if(fa[now]!=pre)
	{
		while(pre!=now)
		{ring[pre]=true;pre=fa[pre];}
		ring[now]=can=true;
		return;
	}
	for(int i=0;i<mp[now].size();i++)
	{
		int nex=mp[now][i];
		if(nex!=pre)get_ring(nex,now);
	}
}
inline void dfshuan(int x)
{
	vis[x]=true;cout<<x<<" ";
	if(ring[x])
	{
		bool flag=false;
		for(int i=0;i<mp[x].size();i++)
		{
			if(huis)break;
			int nex=mp[x][i];
			if(vis[nex])continue;
			if(ring[nex])
			{
				i++;while(i<mp[x].size()&&vis[mp[x][i]])i++;
				if(i<mp[x].size())tmp=mp[x][i];
				else if(nex>tmp)flag=huis=true;
				break;
			}
		}
		for(int i=0;i<mp[x].size();i++)
		{
			int nex=mp[x][i];
			if(ring[nex]&&flag)continue;
			if(!vis[nex])dfshuan(nex);
		}
	}
	else
	{
		for(int i=0;i<mp[x].size();i++)
		{
			int nex=mp[x][i];
			if(!vis[nex])dfshuan(nex);
		}
	}
}
signed main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v;
		mp[u].push_back(v);
		mp[v].push_back(u);
	}
	for(int i=1;i<=n;i++)
	sort(mp[i].begin(),mp[i].end());
	if(m==n-1)dfsshu(1);
	else {get_ring(1,1);dfshuan(1);}
	cout<<endl;
}
原文地址:https://www.cnblogs.com/Ace-MYX/p/11678669.html