洛谷P1433 吃奶酪——DFS,最优化剪枝

本文详细解析洛谷P1433题目,采用深度优先搜索算法求解旅行商问题,通过剪枝优化搜索过程,避免不必要的计算,最终实现高效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:https://www.luogu.org/problemnew/show/P1433

思路:

1、以(0,0)点为起点,进行深搜,相当于进行全排列。

2、最优化剪枝,如果得到的当前距离比已知的最小距离大了,跳出当前层的搜索,这样可以大大节省时间。

if(sum>minn)return;

3、不要与欧拉路、欧拉回路、哈密尔顿环混淆。

4、因为最多15个点,没有必要引入记忆化。

AC代码如下:

/*为保证精度,应该采用double,不能采用float,否则卡三个点*/ 
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int n;
double x[16]={0},y[16]={0};
double minn=1e9,sum=0;
bool vis[16];

double dis(int a,int b){
	return sqrt( (x[a]-x[b])*(x[a]-x[b]) + (y[a]-y[b])*(y[a]-y[b]) );
}

void dfs(int cns,int x){
	if(cns==n){
		minn=min(minn,sum);
		return;
	};
	if(sum>minn)return;/*最优化剪枝,否则TLE*/ 
	for(int i=1;i<=n;i++)
		if(!vis[i]){
			vis[i]=1;
			sum+=dis(x,i);
			dfs(cns+1,i);
			/*回溯*/ 
			vis[i]=0;
			sum-=dis(x,i);
		}
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>x[i]>>y[i];
	vis[0]=1;
	dfs(0,0);
	
	printf("%.2f\n",minn);
}

 

### 关于暴搜加最优化剪枝算法解决奶酪问题 在处理像“奶酪”这样的问题时,暴力搜索(Brute Force Search)是一种直观的方法,但往往由于其巨大的时间复杂度而不适合大规模输入。为了提高效率,在暴力搜索的基础上引入剪枝技术是非常必要的。 #### 暴力搜索与剪枝策略 暴力搜索意味着尝试所有可能的情况直到找到解为止。然而,对于某些特定条件下的分支路径可以直接排除掉,这就是所谓的剪枝操作[^1]。具体到“奶酪”的场景下: - **距离评估**:计算当前节点到达目标位置的距离作为启发函数的一部分,当发现剩余可走步数不足以覆盖该距离,则提前终止此路线探索。 - **重复状态检测**:记录已经访问过的坐标点及其对应的状态信息;一旦遇到相同情况立即停止深入以免陷入循环或冗余运算之中。 ```python from collections import deque def bfs_with_pruning(start, end, grid): queue = deque([(start, 0)]) visited = set([start]) while queue: (x, y), dist = queue.popleft() # Prune based on distance estimation if abs(x - end[0]) + abs(y - end[1]) > remaining_steps: continue if (x, y) == end: return True directions = [(0,-1),(0,1),(-1,0),(1,0)] for dx, dy in directions: nx, ny = x + dx, y + dy if not is_valid(nx, ny, grid): continue next_state = (nx, ny) # Avoid revisiting states if next_state not in visited: visited.add(next_state) queue.append(((nx,ny),dist+1)) return False def is_valid(x,y,grid): rows, cols = len(grid),len(grid[0]) return 0<=x<rows and 0<=y<cols and grid[x][y]!='#' ``` 上述代码展示了如何利用广度优先搜索配合简单的剪枝逻辑来解决问题框架。实际应用中还需要考虑更多细节以及更复杂的约束条件来进行进一步优化[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值