90分求助QAQ
查看原帖
90分求助QAQ
528243
wangxinlong_orange楼主2022/9/16 14:15
#include<cmath>
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
double l[20][20],f[18][34000];
struct node{
	double x,y;
}a[20];
double minx(double p,double q){
	if(p<q) return p;
	else return q;
}
int main(){
	double ans=127;
	a[0].x=a[0].y=0;
	memset(f,127,sizeof(f));
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y);
	for(int i=0;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			l[i][j]=l[j][i]=sqrt(1.0*(a[i].x-a[j].x)*(a[i].x-a[j].x)+1.0*(a[i].y-a[j].y)*(a[i].y-a[j].y));
		}
	}//计算 
	for(int i=1;i<=n;i++) f[i][(1<<(i-1))]=l[0][i];//初始化f 
	for(int k=1;k<(1<<n);k++){//枚举每一种情况 
		for(int i=1;i<=n;i++){
			if((k&(1<<(i-1)))==0) continue;//如果没走这个点就跳过 
			for(int j=1;j<=n;j++){
				if(i==j) continue;//起点和终点相同,跳过 
				else if((k&(1<<(j-1)))==0) continue;//如果没走过就跳过 
				f[i][k]=minx(f[i][k],f[j][k-(1<<(i-1))]+l[i][j]);//状态转移 
			}
		}
	}
	for(int i=1;i<=n;i++) ans=minx(ans,f[i][(1<<n)-1]);//寻找答案 
	printf("%.2lf",ans);
	return 0;
}
2022/9/16 14:15
加载中...