状压 DP WA 45 pts 求调
查看原帖
状压 DP WA 45 pts 求调
749714
xyzfrozen楼主2023/3/10 14:22
#include<bits/stdc++.h>
#define pt putchar(' ')
#define nl puts("")
#define pi pair<int,int>
#define pb push_back
#define go(it) for(auto &it:as[x]) //注意加了&
using namespace std;

const int N=1e3+10,M=4e7+10,V=50;
int n;
bool p[V];
int a[V],q[V],pre[1<<24],res[1<<24];
double ans=1e12;
double f[1<<24],x[N],y[N];
double d[N][N];

int fr() //double不能快读
{
	int x=0,flag=1;
	char ch=getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch=='-') flag=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
	{
		x=x*10+(ch-'0');
		ch=getchar();
	}
	return x*flag;
}

void fw(int x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>9) fw(x/10);
	putchar(x%10+'0');
}

double dis(int a,int b)
{
	return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}

void dfs(int x,double val,int lt)
{
	if(val>=ans) return;
	if(x>=n+1)
	{
		ans=val;
		memcpy(q,a,sizeof a);
	}
	
	for(int i=0;i<n;i++)
	{
		if(!p[i])
		{
			p[i]=1;
			a[x]=i+1;
			dfs(x+1,val+d[i][lt],i);
			a[x]=0;
			p[i]=0;
		}
	}
}

int main()
{
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	
	n=fr();
	int st=n+5;
	y[st]=-1e7;
	
	for(int i=0;i<n;i++)
	{
		scanf("%lf%lf",&x[i],&y[i]);
		if(y[st]<y[i]) st=i;
	}
	
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			d[i][j]=dis(i,j);
	if(n<=9)
	{
		p[st]=1;
		dfs(2,0,st);
		q[1]=st+1;
		for(int i=1;i<=n;i++) fw(q[i]),pt;
	}
	else if(n<=27)
	{
		for(int i=0;i<=(1<<n)-1;i++) f[i]=1e12;
		f[1<<st]=0;
		pre[1<<st]=0;
		
		for(int i=(1<<st);i<=(1<<n)-1;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(!((i>>j)&1))
				{
					for(int k=0;k<n;k++)
					{
						if((i>>k)&1)
						{
							if(f[i+(1<<j)]>f[i]+d[k][j])
							{
								pre[i+(1<<j)]=i;
								f[i+(1<<j)]=f[i]+d[k][j];
							}
						}
					}
				} 
			}  
		}
		
		int x=(1<<n)-1,idx=0;
		while(x)
		{
			res[++idx]=x;
			x=pre[x];
		}
		reverse(res+1,res+1+idx);
		for(int i=1;i<=n;i++)
		{
			int s=res[i];
			for(int j=0;j<n;j++)
			{
				if(!p[j] && (s>>j)&1)
				{
					p[j]=1;
					fw(j+1),pt;
				}
			}
		}
	}
	else
	{
		fw(st),pt;
		for(int i=1;i<=n;i++) if(i!=st) fw(i),pt;
	}
	
	return 0;
}
2023/3/10 14:22
加载中...