暑假末的状压dp 不甘心这么死
  • 板块P1433 吃奶酪
  • 楼主Xeqwq
  • 当前回复9
  • 已保存回复9
  • 发布时间2021/8/29 22:01
  • 上次更新2023/11/4 08:35:52
查看原帖
暑假末的状压dp 不甘心这么死
229373
Xeqwq楼主2021/8/29 22:01

dalao们救救我吧

#include <iostream>
#include <cmath>
#include <cstring>
#include <queue> 
using namespace std;
int n;
int x[20],y[20];
double d[20][20];
double minn[65540][20];
double ans=10000000;
int tot;
queue<int> q;
queue<int> last;
double dis(int i,int j)
{
	return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>x[i]>>y[i];
	for(int i=0;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
			d[i][j]=d[j][i]=dis(i,j);
	}
	int j,k;
	memset(minn,127,sizeof(minn));
	q.push(0);
	last.push(0);
	int p,l,temp; 
	while(!q.empty())
	{
		p=q.front();
		l=last.front();
		q.pop();
		last.pop();
		temp=p;
		for(int i=1;i<=n;i++)
		{
			if((temp >> i)&1)
			{
				temp+=(1 << i);
				if(minn[p][l]+d[l][i]<minn[temp][i])
				minn[temp][i]=minn[p][l]+d[l][i]; 
				q.push(temp);
				last.push(i);
				temp-=(1 << i);
			}
		} 
	} 
	for(int i=1;i<=n;i++)
	{
		if(minn[1<<(n+1)][i]+d[i][0]<ans)
			ans=minn[1<<(n+1)][i]+d[i][0];
	
	}
	cout<<ans;
	return 0;
}
2021/8/29 22:01
加载中...