春测T3 60分部分分求调
  • 板块学术版
  • 楼主expnoi
  • 当前回复23
  • 已保存回复23
  • 发布时间2023/3/5 08:02
  • 上次更新2023/10/23 23:01:57
查看原帖
春测T3 60分部分分求调
378346
expnoi楼主2023/3/5 08:02
	if(n<=18)
	{
		for(int i=0;i<n;i++)//从0开始,方便运算。 
		{
			cin>>x[i]>>y[i];
		}
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				w[i][j]=distan(x[i],y[i],x[j],y[j]);
			}
		}
		int k=n;
		for(int i=0;i<n;i++)
		{
			if(y[i]>y[k])
			{
				k=i;
			}
		}
		for(int i=0;i<=(1<<n);i++)
			for(int j=0;j<=18;j++)
				dp[i][j]=1e17,last[i][j]=-1;
		dp[1<<k][k]=0;
		for(int S=0;S<(1<<n);S++){
			for(int i=0;i<n;i++){//终点 
				if(!(S&(1<<i)))continue;
				for(int j=0;j<n;j++)//起点 
				{
					if(!(S&(1<<j))||i==j)continue;
					if(dp[S][i]>dp[S^(1<<i)][j]+w[j][i])
					{
						dp[S][i]=dp[S^(1<<i)][j]+w[j][i];
						last[S][i]=j;
					}
				}
			}
		}
		int u=0;
		for(int i=0;i<n;i++)
		{
			if(dp[(1<<n)-1][i]<dp[(1<<n)-1][u])u=i;
		}
		ans[++m]=u;
		int S=(1<<n)-1;
		while(~last[S][u])
		{
			ans[++m]=last[S][u];
			int tmp=u;
			u=last[S][u];
			S=(S^(1<<tmp));
		}
		for(int i=m;i>=1;i--)
		{
			cout<<ans[i]+1<<' ';
		}
		return 0;
	}
2023/3/5 08:02
加载中...