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