求助,我在旅行中杀死小Y导致第二个样例过不去(玄关)
查看原帖
求助,我在旅行中杀死小Y导致第二个样例过不去(玄关)
1202695
Junior_Young楼主2024/10/20 10:52

对不起,我是标题党。

各位奆佬们帮帮我这个蒟蒻啊TAT

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=5002;
vector<int> v[N];
int ans[N],res[N];
int From[N],To[N];
bool st[N];
int cnt,Dx,Dy;
int n,m;
void dfs(int Now,int From)
{
	if(st[Now]) return;
	st[Now]=1;
	ans[++cnt]=Now;
	for(int i=0;i<v[Now].size();++i)
		dfs(v[Now][i],Now);
}
void dfs1(int Now,int From)
{
	if(st[Now]) return;
	st[Now]=1;
	res[++cnt]=Now;
	for(int i=0;i<v[Now].size();++i)
	{
		if(!(Now==Dx&&v[Now][i]==Dy||Now==Dy&&v[Now][i]==Dx))
			dfs(v[Now][i],Now);
	}
		
}
bool Check()
{
	for(int i=1;i<=n;++i)
	{
		if(res[i]<ans[i]) return 1;
		else if(res[i]>ans[i]) return 0;
	}
	return 0;
}
void Update()
{
	for(int i=1;i<=n;++i)
		ans[i]=res[i];
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;++i)
	{
		int x,y;
		cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
		From[i]=x,To[i]=y;
	}
	for(int i=1;i<=n;++i)
		sort(v[i].begin(),v[i].end());
	if(m==n-1)
	{
		dfs(1,0);
	}
	else
	{
		for(int i=0;i<=n+1;++i)
		{
			ans[i]=114514;
		}
		for(int i=1;i<=m;++i)
		{
			for(int j=0;j<=n+1;++j)
			{
				st[j]=0;
				res[j]=0;
			}
			cnt=0;
			Dx=From[i],Dy=To[i];
			dfs1(1,0);
			if(cnt<n) continue;
			if(i==1||Check()) Update();
		}
	}
	for(int i=1;i<=n;i++)
		cout<<ans[i]<<' ';
	return 0;
}
2024/10/20 10:52
加载中...