最小生成树 大扫除

这篇博客探讨了一种看似搜索实为最小生成树问题的牧圈清洁算法。通过对地形高度数据的分析,作者指出如何构建图并确定边的权重,即使用最小值作为相邻节点之间的权值,进而通过求解最小生成树来找到最小花费的清洁路径。
摘要由CSDN通过智能技术生成

问题描述

现在要打扫约翰的牧圈。已经很多年没打扫了。所以这次的计划是用河水来冲。
牧圈排成整齐的格子,每相邻的两个之间都有门。要想让水进去,就必须打开这些门。这不是件容易的事情。因为有些圈里土堆得很高。因此打开门就很费劲。为了使花的力气最小,总是把门推向土低的一边。你的任务是计算最少得费多少劲。我们用土的厚度来描述这个值。

输入格式

第一行是宽度w和高度h,其中3<=w,h<=40。以下h行数据,描述了土的高度,也就是我们所浪费体力的度量。数据的范围在1到100之间。

输出格式

你得到的结果。所有的格子都必须进水。水是从左上角的格子进去的。

样例输入

4 3
3 5 2 1
7 3 4 8
1 6 5 7

样例输出

26

初看这道题,只觉得这是一道搜索题,怎么说他是一个最小生成树的问题呢?

我一开始也是这么想的:

在这里插入图片描述
其实8不会连到7

这不就很显然的是一个搜索题吗?其实不然,我们这样来看:

在这里插入图片描述

左图可以看作右图,然后再看看这个:

在这里插入图片描述

这不就是原图的最小生成树吗!

所以问题就出现在了简图上面, 我们这样建图是这样建的:
对于(i, j)这个点,我们要对(i+1, j), (i, j+1)连一条边,他们的权值是min(a[i][j], a[i + 1][j]) 和 min(a[i][j], a[i][j + 1]),然后求最小生成树就行了。

#include <bits/stdc++.h>
using namespace std;
#define MAXN 2005
#define MAXM 45
struct node{
   
	int u, v, w;
}f;
bool operator< (node x,node y) {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值