喫奶酪(深搜+剪枝)

在這裏插入圖片描述
注意:這裏的剪枝,和提前預處理打表等優化方法很經典

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std; 
double ww[100][2];
double LL[1001][1001];
int n;
double mint=1231234424.0;
bool vis[1001];//表示奶酪有沒有喫過 
double lc(double x1,double y1,double x2,double y2){//變量數據類型要重點注意 
	double p1=(x1-x2)*(x1-x2);
	double p2=(y1-y2)*(y1-y2);
	return sqrt(p1+p2);
}
void dfs(int now,int step,double sum){//k表示喫掉奶酪的數目 
   if(sum>mint){//剪枝要不然會超時 
		return;
	}
	if(step==n){
		mint=min(sum,mint);
		return;
	}
	
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			vis[i]=true;
			dfs(i,step+1,sum+LL[now][i]);
			vis[i]=false;
		}
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lf %lf",&ww[i][0],&ww[i][1]);
	}
	ww[0][0]=0,ww[0][1]=0;//起始點處理
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n;j++){
			LL[i][j]=lc(ww[i][0],ww[i][1],ww[j][0],ww[j][1]);//打表預處理
		}
	}
	dfs(0,0,0.0);
	printf("%.2f",mint);
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章