当前位置: 首页 > news >正文

网格图分治模型

若网格图面积为 \(S\),取短边分治,令分治层的复杂度和短边相关(一般是从短边上每个点出发对整个网格图 DP/搜索 之类的)。

因为短边长度 \(O(\sqrt S)\)(一般)一层复杂度是 \(O(S\sqrt S)\),总复杂度 \(T(S)=2T(S/2)+O(S\sqrt S)=O(S\sqrt S)=O(n^3)\)

例一:P6976

多次查询最短路,我们联想到网格图最短路的分治模型。

  • 如果行数(或者对称的列数)比较小,可以直接对列分治,从分界列上每个点为起点跑最短路,然后计算跨过分界列的查询。

  • 如果行列个数大概同阶,就选小的那边分治,同理计算。

以上两种做法都是沿用了一个思路:取一个不大的点集,让它们构成图的割集。从这个点集里每个点作为起点都跑一次最短路,用 "经过它们的最短路" 来更新答案,再递归入割开的每个块里继续处理。

有了这个想法本题就比较简单了。考虑取什么割集,比较好想到只要取一条对角线,然后从两个端点出发跑最短路,再递归进对角线两半就行了。那问题在于取什么对角线,如果取的对角线分出的两半大小很不均匀就炸了。

然后考虑取什么对角线是比较均匀的。一个自然的想法是找到圆心,取圆心所在三角形的三条边里划分最均匀的那条。

事实上这是对的,因为这三条边划分出来较大的部分一定是圆心所在部分,而较小的那部分都不相交,所以三个较小的部分里大小最大的一定超过 \(n/3\)。因此一次递归会划分为 \(1/3\)\(2/3\) 两个部分,一共 \(\log\) 层到底。

因为是没有边权的,所以求最短路 bfs 即可,复杂度 \(O((n+q)\log n)\)

注意如果有边权的话,就算起点终点位于同一边,但仍然可能存在起点跨过分界线再回来的最短路。


另外一种观察角度是注意到这个东西是个平面图,平面图那就自然考虑对偶图。然后发现对偶图上是若干个三角形作为点的。

手玩一下可以得出结论:对偶图是一棵树,且每个点的度数 \(\le 3\)。然后在对偶图上做边分治即可,就是和上面一样的过程。

http://www.rkmt.cn/news/60805.html

相关文章:

  • Python内置的lru_cache装饰器实现缓存教程
  • 北京墙体彩绘公司推荐香鲸艺术坊,行业排名遥遥领先!
  • java---gradle配置国内镜像
  • 11月25日日记
  • 几道树上计数问题
  • 接入层傻瓜机引起的VLAN间环路
  • Spring IOC 源码学习一 基本姿势
  • 可持久化01trie板子
  • 2025年11月25日
  • 2025年节油的轮胎推荐:官方TOP10低滚阻榜单揭秘
  • 实用指南:云计算学习(三)——子网划分
  • 基于 Vue3 及TypeScript 项目后的总结 - 详解
  • 慢就是快 用在生活中
  • 计你太美
  • 2025年大众帕萨特更换轮胎推荐:官方权威指南深度解析
  • 2025-11-25 ZYZ28-NOIP模拟赛-Round9 hetao1733837的record
  • 详细介绍:Python之aedev-setup-project包语法、参数和实际应用案例
  • leetcode238. 除自身以外数组的乘积 未解决
  • python environment settings
  • 有限元技巧核心原理与学习路径:从一维基础到多维拓展(七步流程)
  • 实用指南:面向高并发场景的舆情处置技术实践——基于字节探索Infoseek的架构拆解
  • sg 多堆的取石子游戏
  • Day48(18)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02\tlias-web-management
  • 日总结 31
  • 102302114_比山布努尔兰_作业3
  • 第四十八篇
  • Django 用户认证流程详解:从原理到搭建
  • i.MX 6ULL复位管脚
  • [豪の算法奇妙冒险] 代码随想录算法训练营第六天 | 242-有效的字母异位词、349-两个数组的交集、202-快乐数、1-两数之和
  • 棋盘 就是最简单的nim