dfs求调 90pts
  • 板块P1433 吃奶酪
  • 楼主StevenYan
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/1/14 18:19
  • 上次更新2025/1/14 22:02:21
查看原帖
dfs求调 90pts
1260548
StevenYan楼主2025/1/14 18:19

一个简单的dfs
使用最优性
90AC 其余TLE

#include<bits/stdc++.h>
using namespace std;
struct nod{
	double x,y;
}a[20];
int n;
int vis[20]={0};
double dsc[20][20];//记录距离
double d(double x1,double y1,double x2,double y2){
	return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}
double ans=1e5;
void dfs(int num,int dep,double nowans){
	if(dep==n){
		ans=min(nowans,ans);
		return;
	}
	for(int i=1;i<=n;i++){
		if(nowans+dsc[num][i]<ans&&vis[i]==0){//最优性剪枝
			vis[i]=1;
			dfs(i,dep+1,nowans+dsc[num][i]);
			vis[i]=0;
		}
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].x>>a[i].y;
		dsc[0][i]=d(0,0,a[i].x,a[i].y);
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if(i!=j){
				dsc[i][j]=dsc[j][i]=d(a[i].x,a[i].y,a[j].x,a[j].y);
			}
		}
	}
	for(int i=1;i<=n;i++){//列举第一块的可能
		memset(vis,0,sizeof(vis));
		vis[i]=1;
		dfs(i,1,dsc[0][i]);
	}
	printf("%.2f",ans);
	return 0;

}
2025/1/14 18:19
加载中...