关于60分RE和76分WA的两个问题
查看原帖
关于60分RE和76分WA的两个问题
141335
qwq2519楼主2020/10/21 09:55

以下代码改自题解

#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

2020/10/21 09:55
加载中...