求助 WA on #24
查看原帖
求助 WA on #24
482856
TigerNick楼主2024/6/2 00:22

思路是先找环再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;
}

2024/6/2 00:22
加载中...