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

08.21总结

圆方树

引入

我们注意到,树结构相比普通图具有诸多优良特性。若能将在无向图上求解的问题转化为树结构问题,往往能大幅简化求解过程。圆方树正是实现这一转化的有效工具。

定义

我们称原图中的点为"圆点"。通过引入方点并调整边的关系,可以构造出一棵树。通过合理赋权,使这棵树能够保持原图的某些特性,从而将原问题转化为树上的问题。具体构建过程如下:对于每个点双连通分量,首先删除其中所有圆点之间的直接连接边。然后为该点双新增一个方点,并将该点双内的所有圆点都与这个方点相连。这样构建出的图是一个无环的连通图,即所谓的圆方树。构建过程本身并不复杂,只要掌握点双连通分量的求法即可完成。而难点在于:如何恰当设置权值,使得在圆方树上能够求解原问题。

代码

void tarjan(int u, int fa) {low[u] = dfn[u] = ++tot;sta.push(u);for (auto v : ve[u]) {if (v == fa) continue;if (!dfn[v]) {tarjan(v, u);low[u] = min(low[u], low[v]);if (low[v] >= dfn[u]) {      // 发现点双int now = 0;sid++;    // 方点id,初始值为nvn[u].push_back(sid);    //建双向边vn[sid].push_back(u);while (now != v) {now = sta.top();vn[now].push_back(sid);    //建双向边vn[sid].push_back(now);sta.pop();}}} else {low[u] = min(low[u], dfn[v]);}}
}

例题

铁人两项
给定一张无向图,问有多少互不相同三元组<aaa, bbb, ccc>
使得存在一条从 aaabbb 经过 ccc 的简单路径。

题解

在同一个点双连通分量中,任意两点之间的所有简单路径的并集恰好构成该点双。对于任意两点,其简单路径所经过的点集可表示为路径上各点双的并集。在圆方树模型中,该点集对应为: 两个圆点路径上的所有圆点和路径上方点相邻的所有圆点 。由于限制条件 c≠ac ≠ ac=ac≠bc ≠ bc=b,最终答案为该点集大小减 2。 具体实现时,考虑圆方树上的权值设计: 将方点权值设为相邻圆点数量,并将圆点权值设为 -1(避免相邻方点重复计算),而路径端点不计入贡献。这样,圆方树上两圆点间路径的点权和即为所求答案。问题转化为统计树上所有圆点对的路径权值和,可通过树形 DP 计算每个点的贡献(点权 ×\times× 经过该点的路径数)来高效求解。

http://www.xdnf.cn/news/18646.html

相关文章:

  • Claude Code 三类.md文件
  • Day2--HOT100--283. 移动零,11. 盛最多水的容器,15. 三数之和
  • PCB电路设计学习2 元件原理图封装的添加 手工设计元件封装
  • 大型前端项目如何实现css 隔离:利用浏览器原生的 Shadow DOM 完全隔离 DOM 结构与样式...
  • Linux 下的网络编程
  • 学习嵌入式的第二十四天——数据结构——队列和树
  • Git 提交除某个文件外的其他所有文件
  • 微信开发者工具:更改 AppID 失败
  • 嵌入式-EXTI的工作原理和按钮实验-Day19
  • 我从零开始学习C语言(13)- 循环语句 PART2
  • QT-窗口类部件
  • K8S高可用集群
  • K8s的相关知识总结
  • 如何理解面向过程和面向对象,举例说明一下?
  • Qt5 的跨平台开发详细讲解
  • 计算机毕设选题推荐 基于Spark的家庭能源消耗智能分析与可视化系统 基于机器学习的家庭能源消耗预测与可视化系统源码
  • 告别第三方流氓工具,如何实现纯净系统维护
  • DIC技术极端环境高温案例分享——从1600℃的锆合金力学性能测试到3000℃变形测试的DIC测量
  • 手机、电脑屏幕的显示坏点检测和成像原理
  • k8s----学习站点搭建
  • C++显示类型转换运算符static_cast使用指南
  • 贪吃蛇--C++实战项目(零基础)
  • 大模型微调:从理论到实践的全面指南
  • 【链表 - LeetCode】19. 删除链表的倒数第 N 个结点
  • Laravel 使用阿里云OSS S3 协议文件上传
  • Java多线程面试题二
  • Flask电影投票系统全解析
  • WPF控件随窗体大宽度高度改变而改变
  • 金融风控AI引擎:实时反欺诈系统的架构设计与实现
  • Rust 入门 注释和文档之 cargo doc (二十三)