夜袭寡妇村

122 篇文章 0 订阅
89 篇文章 0 订阅

题目

题目概要
这是一个交通发达的城市。

整个城市被道路分隔成了 n × m n\times m n×m 个正方形,排列成了 n n n m m m 列的矩形。任意两个正方形之间都有一条道路,两条道路的交界处是十字路口。一些正方形是村庄,另一些是公共厕所。

现在你要修一条护城河。护城河会形成一个环,包含所有的村庄。护城河只可以修在道路的任意一侧,即,护城河不能穿越一个正方形,而且一条道路可以两侧都修建护城河。在十字路口处,护城河可以流向任意一个方向。

修建代价是边权和(如果一条道路两侧都修建了护城河,边权要计算两次)。你要让总代价最小。

数据范围与提示
n , m ≤ 400 n,m\le 400 n,m400,为了去除你离散化的烦恼,保证第一行第一列是个村庄。

思路

如果只有第一行第一列的村庄(我们称之为村委会),那么答案就是从左上角到左上角的最短路(并不是直接选择村委会的四条邻边就一定最优哦)。

如果有多个村庄的话,这条最短路很可能无法包含所有村庄。有一个好主意:对于每个村庄,选择它的左上角到村委会左上角的一条路径,跑最短路时,不允许 跨过(可以重合)这些边。一定存在这样的路径,否则就不能把二者都包住了。

问题成为了,路径选择谁呢?答案是 最短路。因为最短路上任意两点之间都是最短路。选择的护城河相当于一个多边形,最短路是一条起点、终点都在多边形内部的折线(是折线、曲线无所谓),根据拓扑学,护城河与最短路的前两个交点 u , v u,v u,v 之间有两条路,护城河在内、最短路在外。那么,将护城河换成最短路,显然会更好(边权变小、包含范围变大)。否则,没有交点,最短路就被包含了。

所以就这么做呗。从村委会的左上角为源点作最短路,即可求出每个村庄的最短路。然后再做一次。

复杂度 O [ n m ( log ⁡ n + log ⁡ m ) ] \mathcal O[nm(\log n+\log m)] O[nm(logn+logm)] d i j k s t r a \tt dijkstra dijkstra 的复杂度。贴一张图辅助理解:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值