96分求助
查看原帖
96分求助
528787
OIer_Automation楼主2024/1/1 15:16

他凭什么不对啊啊啊啊啊啊啊!

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

const int N=5e3;
int n,m,x,y,top,fir,sec,unv;
int stk[N+5];
bool g[N+5][N+5],mark[N+5],ins[N+5],vis[N+5],vis2[N+5];

void dfs1(int u,int fa){
	printf("%d ",u);
	for(int i=1;i<=n;i++){
		if(!g[u][i]||i==fa)continue;
		dfs1(i,u);
	}
	return ;
}

void dfs2(int u,int fa){
	stk[++top]=u;
	ins[u]=vis[u]=true;
	for(int i=1;i<=n;i++){
		if(!g[u][i]||i==fa)continue;
		if(ins[i]){
			int j;
			for(j=top;stk[j]!=i;j--){
				mark[stk[j]]=true;
				ins[stk[j]]=false;
			}
			mark[i]=true;
			fir=min(u,stk[j+1]);
			sec=max(u,stk[j+1]);
			return ;
		}
		if(!vis[i])dfs2(i,u);
	}
	--top;
	ins[u]=false;
	return ;
}

void dfs5(int u,int fa){
	printf("%d ",u);
	vis2[u]=true;
	for(int i=1;i<=n;i++){
		if(!g[u][i]||i==fa||vis2[i])continue;
		dfs5(i,u);
	}
	return ;
}

void dfs4(int u,int fa){
	printf("%d ",u);
	vis2[u]=true;
	for(int i=1;i<=n;i++){
		if(!g[u][i]||i==fa||vis2[i])continue;
		if(mark[i]){
			if((unv==n+1||unv<i)&&sec<i)return ;
			for(int j=i+1;j<unv;j++){
				if(!g[u][j]||j==fa)continue;
				unv=j;
			}
			dfs4(i,u);
			for(int j=i+1;j<=n;j++){
				if(!g[u][j]||j==fa)continue;
				dfs5(j,u);
			}
			return ;
		}else dfs5(i,u);
	}
	return ;
}

void dfs3(int u,int fa){
	printf("%d ",u);
	vis2[u]=true;
	if(mark[u]){
		for(int i=1;i<=n;i++){
			if(!g[u][i]||i==fa||vis2[i])continue;
			if(i==fir)dfs4(fir,u);
			else if(i==sec)dfs5(sec,u);
			else dfs3(i,u);
		}
		return ;
	}
	for(int i=1;i<=n;i++){
		if(!g[u][i]||i==fa)continue;
		dfs3(i,u);
	}
	return ;
}

int main(){
//	freopen("travel.in","r",stdin);
//	freopen("travel.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		g[x][y]=g[y][x]=true;
	}
	if(m==n-1)dfs1(1,0);
	else{
		dfs2(1,0);
		unv=n+1;
		dfs3(1,0);
	}
	return 0;
}
2024/1/1 15:16
加载中...