蒟蒻代码求调
查看原帖
蒟蒻代码求调
251775
galiyuebing楼主2023/9/12 20:48

rt

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#define pdd pair<double,double>
using namespace std;
int n,d,cnt; 
pdd c[30];
bool vis[30];
double dis[30][30],dp[30][1000000],ans=998244353.9;

int main()
{
	cin>>n>>d;
	for(int i=1;i<=n;++i)
		scanf("%lf%lf",&c[i].first,&c[i].second);
	memset(dp,127,sizeof(dp));
	for(int i=0;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
		{
			dis[i][j]=min((double)d,sqrt((c[i].first-c[j].first)*(c[i].first-c[j].first) + (c[i].second-c[j].second)*(c[i].second-c[j].second)));
			if(dis[i][j]==d)dis[i][j]=998244353.9;
		}
		if(i!=0)dp[i][(1<<(i-1))]=dis[0][i];
	}
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
	
	for(int j=1;j<=(1<<n)-1;++j)
	{
		for(int i=1;i<=n;++i)
		{
			if(!((j>>(i-1))&1))continue;
			for(int k=1;k<=n;++k)
			{
				if(!(( j ^ ( 1<<(i-1) ) >> (k-1) ) & 1 )) continue;
				dp[i][j]=min(dp[i][j],dp[k][ j ^ (1<<(i-1))]+dis[k][i]);
			}
		}
	 } 
	for(int i=1;i<=n;++i)ans=min(ans,dp[i][(1<<n)-1])+dis[0][i];
	printf("%.2lf",ans);
	return 0;
}



2023/9/12 20:48
加载中...