88分调了快一周了,蹲dalao
查看原帖
88分调了快一周了,蹲dalao
346868
Stone2007楼主2023/6/5 21:43

WA on #16 #18 #22

#include<bits/stdc++.h>
using namespace std;
int n,m,st,fa[500005],d1,d2,maxsub;
bool vis[500005],r[500005];
vector<int> s[500005];
deque<int> q;
void dfs(int x)
{
	printf("%d ",x);
	vis[x]=true;
	for(int i=0;i<s[x].size();i++)
	{
		int to=s[x][i];
		if(vis[to]==true)
			continue;
		if((x==d1&&to==d2)||(x==d2&&to==d1))
			continue;
		dfs(to);
	}
}
void cutside(int x,int y)
{
	while(q.front()!=x)
		q.pop_front();
	while(q.back()!=y)
		q.pop_back();
	int neww=q.front();
	q.pop_front();
	while(!q.empty())
	{
		int now=q.front();
		q.pop_front();
		maxsub=max(maxsub,now);
		for(int i=0;i<s[now].size();i++)
		{
			int to=s[now][i];
			if(to==q.front()||to==neww)
				continue;
			maxsub=max(maxsub,to);
  		}
  		if(q.front()>maxsub)
  		{
			d1=now;
			d2=q.front();
			dfs(1);
			exit(0);
		}
  	}
}
bool flag;
void findround(int x,int f)
{
	q.push_back(x);
	if(fa[x]&&fa[x]!=f&&flag==false)
	{
		flag=true;
		cutside(x,f);
	}
	fa[x]=f;
	for(int i=0;i<s[x].size();i++)
	{
		int to=s[x][i];
		if(to!=f)
			findround(to,x);
		if(flag==true)
			return;
	}
	q.pop_back();
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		s[u].push_back(v);
		s[v].push_back(u);
	}
	for(int i=1;i<=n;i++)
		sort(s[i].begin(),s[i].end());
	if(m==n)
		findround(1,1);
	memset(vis,0,sizeof(vis));
	dfs(1);
	return 0;
}

*蒟蒻求大佬帮忙,感恩不尽qwq

2023/6/5 21:43
加载中...