84分,T21,22,23,24就离谱
查看原帖
84分,T21,22,23,24就离谱
153274
ignited楼主2020/11/21 23:17

rt

#include <bits/stdc++.h>
using namespace std;

vector<int> g[5010];

int n,m,cnt,p[5010],ans[5010],fa[5010],loop[5010],end,start;

bool vis[5010],flag,edge[5010][5010],f1;

bool cmp(int p[],int q[],int k)
{
	for(int i=1;i<=k;i++)
	{
		if(p[i]<q[i]) return 1;
		if(p[i]>q[i]) return 0;
	}
	return 1;
}

void dfs(int u,int fa)
{
    if(f1) return;
	cnt++;
	p[cnt]=u;
	
	if(!cmp(p,ans,cnt))
	{
		f1=1;
		return;
	}
	
	int child[5010]={};
	int q=1;
	for(int i=0;i<g[u].size();i++)
	{
		if(g[u][i]==fa||edge[u][g[u][i]]==0) continue;
		child[q]=g[u][i];
		q++;
	}
	sort(child+1,child+q);
	for(int i=1;i<q;i++) dfs(child[i],u);
}

void find_loop(int u,int fa)
{
	vis[u]=1;
	loop[u]=fa;
	if(flag) return;
	for(int i=0;i<g[u].size();i++)
	{
		if(g[u][i]==fa) continue;
		if(vis[g[u][i]]&&flag==0)
		{
			start=u;
			end=g[u][i];
			flag=1;
			loop[end]=start;
			return;
		}
		if(flag)return;
		find_loop(g[u][i],u);
	}
}

int main ()
{
	
	//freopen("P5022_20.in","r",stdin);
	//freopen("P5022_20.out","w",stdout);
	cin>>n>>m;
	
	for(int i=1;i<=m;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].push_back(v);
		g[v].push_back(u);
		edge[u][v]=edge[v][u]=1;
	}
	
	for(int i=1;i<=n;i++) ans[i]=n;
	
	if(m==n-1)
	{
		dfs(1,0);
		for(int i=1;i<=n;i++) cout<<p[i]<<' ';
	}
	
	if(m==n)
	{
		find_loop(1,0);
		loop[end]=start;
		
		edge[end][start]=edge[start][end]=0;
		dfs(1,0);
		
		for(int i=1;i<=n;i++) ans[i]=p[i];
		
		edge[end][start]=edge[start][end]=1;
		
		for(int i=start;i!=end;i=loop[i])
		{
			f1=0;
			cnt=0; 
			edge[i][loop[i]]=edge[loop[i]][i]=0;
			dfs(1,0);
			if(cmp(p,ans,n)) for(int i=1;i<=n;i++) ans[i]=p[i];
			edge[i][loop[i]]=edge[loop[i]][i]=1;
		}
		
		for(int i=1;i<=n;i++) cout<<ans[i]<<' ';
	}
	
	return 0;
}
2020/11/21 23:17
加载中...