TLE且只TLE了第19个点,麻烦大佬指点
查看原帖
TLE且只TLE了第19个点,麻烦大佬指点
104259
qzc0131楼主2020/10/24 16:27

单纯的T掉了第十九个点,甚至连23、24、25都过了,想知道怎么改

#include<bits/stdc++.h>
using namespace std;
int v[10002][3],tail[5001],frm[5001],num,tmp[5001],ans[5001]={-1},t;
bool vst[10002];
int _r(void);
void _w(int);
void dfs(int);
void _dfs(int);
bool pd(int*,int*);
void change(int*,int*);
int main()
{
	freopen("in.txt","r",stdin);
	memset(tail,-1,sizeof(tail));
	memset(frm,-1,sizeof(tail));
	int n=_r(),m=_r(),x,y;
	for(int i=1;i<=m;++i)
	{
		x=_r();
		y=_r();
		v[i*2-1][0]=v[i*2][1]=x;
		v[i*2-1][1]=v[i*2][0]=y;
		v[i*2-1][2]=tail[x];
		v[i*2][2]=tail[y];
		tail[x]=i*2-1;
		tail[y]=i*2;
	}
	frm[1]=1;
	if(m==n-1)
	{
		dfs(1);
		for(int i=1;i<t;++i)
			cout<<tmp[i]<<' ';
		cout<<tmp[t]<<endl;
		return 0;
	}
	_dfs(1);
	int i=num;
	do
	{
		int j=tail[i];
		while(v[j][1]!=frm[i])
			j=v[j][2];
		memset(vst,0,sizeof(vst));
		t=0;
		vst[j]=1;
		vst[j+((j&1)?1:-1)]=1;
		dfs(1);
		if(pd(tmp,ans)||ans[0]==-1)
			change(tmp,ans);
		i=frm[i];
	}while(i!=num);
	for(int i=1;i<t;++i)
		cout<<ans[i]<<' ';
	cout<<ans[t]<<endl;
}
int _r(void)
{
	int n=0;
	char c=getchar();
	while(c<'0'||c>'9')
		c=getchar();
	while(c>='0'&&c<='9')
	{
		n=n*10+c-'0';
		c=getchar();
	}
	return n;
}
void _w(int n)
{
	if(n>9)
		_w(n/10);
	putchar(n%10+'0');
}
void dfs(int n)
{
	bool f=1;
	tmp[++t]=n;
	while(f)
	{
		f=0;
		int mn=-1;
		for(int i=tail[n];i!=-1;i=v[i][2])
			if(vst[i]==0&&(mn==-1||v[i][1]<v[mn][1]))
			{
				f=1;
				mn=i;
			}
		if(f)
		{
			vst[mn]=1;
			vst[mn+((mn&1)?1:-1)]=1;
			dfs(v[mn][1]);
		}
	}
}
void _dfs(int x)
{
	for(int i=tail[x];i!=-1;i=v[i][2])
		if(frm[v[i][1]]==-1)
		{
			frm[v[i][1]]=x;
			_dfs(v[i][1]);
		}
		else
			if(v[i][1]!=frm[x])
			{
				frm[v[i][1]]=x;
				num=x;
			}
}
bool pd(int*a,int*b)
{
	for(int i=0;i<=5000;++i)
		if(a[i]!=b[i])
			return a[i]<b[i];
	return 0;
}
void change(int*a,int*b)
{
	int tmp;
	a[0]=b[0]=0;
	for(int i=1;i<=5000;++i)
	{
		tmp=a[i];
		a[i]=b[i];
		b[i]=tmp;
	}
}
2020/10/24 16:27
加载中...