图论学习笔记 4 - 仙人掌图

news2025/7/18 12:01:54

先扔张图:


为了提前了解我们采用的方法,请先阅读《图论学习笔记 3》。

仙人掌图的定义:一个连通图,且每条边只出现在至多一个环中。

这个图就是仙人掌图。

这个图也是仙人掌图。

而这个图就不是仙人掌图了。

很容易发现,仙人掌图就是在树上连了若干条边( ≥ 1 \ge 1 1 条)。所以可以视为仙人掌图是基环树的扩展。


众所周知,我们通过想象基环树的深搜树形态解决了基环树的一些问题,所以也考虑想象仙人掌图的深搜树。

这里就直接给图了:

很容易发现以下性质:

  • 仙人掌图中,每一条回边互不相交且与环一一对应,环由回边与祖先到子孙的链构成。(这个比较显然,可以简单理解)

  • 任何一个环的 u p up up 点或者是 d n dn dn 点,其子树一定包含的是完整的环。

很容易感性理解。 u p up up 的子树一定包含所有的环点, d n dn dn 的子树一定不包含所有的环点。所以就可以证了。

  • 在每一个点的子树中,至多有一个没有遍历到其对应的 u p up up 点的 d n dn dn 点。

考虑反证法,设我们有一个点 x x x,其子树里面有两个没有遍历到其对应的 u p up up 点的 d n dn dn 点。设两个 u p up up 点为 u p 1 , u p 2 up1,up2 up1,up2,设两个 d n dn dn 点为 d n 1 , d n 2 dn1,dn2 dn1,dn2

很容易发现,两个 u p up up 点一定是 x x x 的祖先。不妨这里设 u p 1 up1 up1 u p 2 up2 up2 的祖先。

容易发现, u p 1 up1 up1 x x x 的一整条路径都出现在了两个环中,所以这样是矛盾的,原结论得证。


T425915 仙人掌图最大独立集

首先默认已经做过基环树版本的 骑士 那道题了。

回顾一下那道题的做法,可以发现对于一条回边 u p → d n up \to dn updn 构成的环,我们是在原有的 没有上司的舞会那道题 d p dp dp 状态上进行了一个升维,在记录子树根结点有没有选的同时还记录了 d n dn dn 有没有选。

考虑将这种方法扩展到仙人掌图上面,但是我们发现一个结点的子树里面可能有很多的 d n dn dn(并不是只有一个环了),而且数量是会变化的,而我们又不可能 2 n 2^n 2n 记录所有的 d n dn dn 选没选,所以在状态设计方面遇到了一点“困难”。

但是我们发现,上述结论 3 就是为我们量身定制的,因为其他已经被考虑过的环已经不用再考虑(这是仙人掌图,不会出现环套环的情况),所以只需要把目光放在这个没有走到 u p up up d n dn dn 点就行了。

所以就可以设计状态了。至此思路已经成型,直接把那道题的代码拿过来改改就行了。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 50010;
int n;
vector<int> v[N];
int dp[N][4];
bool stk[N], vis[N];
int up[N];
int m;

void dfs(int u, int pre) {
	vis[u] = stk[u] = 1;
	dp[u][1] = dp[u][3] = 1, dp[u][0] = dp[u][2] = 0;
	for (auto i : v[u])
		if (!vis[i]) {
			dfs(i, u);
			if (up[i] != 0 && up[i] != u)
				up[u] = up[i];
			if (u == up[i]) {
				dp[u][0] += max(max(dp[i][0], dp[i][1]), max(dp[i][2], dp[i][3]));
				dp[u][1] += dp[i][0];
				dp[u][2] += max(max(dp[i][0], dp[i][1]), max(dp[i][2], dp[i][3]));//很容易发现,对于一个环结束的时候,可以取 dp[2] 和 dp[0] 的增量相同,dp[3] 和 dp[1] 的增量相同
				dp[u][3] += dp[i][0];
			} else {
				dp[u][0] += max(dp[i][0], dp[i][1]);
				dp[u][1] += dp[i][0];
				dp[u][2] += max(dp[i][2], dp[i][3]);
				dp[u][3] += dp[i][2];
			}
		} else if (i != pre && stk[i])
			up[u] = i, dp[u][1] = dp[u][2] = -1e16;
	stk[u] = 0;
}

signed main() {
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int x, y;
		cin >> x >> y;
		v[x].push_back(y), v[y].push_back(x);
	}
	dfs(1, 0);
	cout << max(dp[1][0], dp[1][1]) << endl;
	return 0;
}

可以发现,这份代码和骑士那道题的那份代码是差不多了,主要改动就是把原来的单个元素 u p up up 变成了一个数组 up[]

最大独立集时间复杂度

学了这么多独立集,来总结一下各种图的求最大独立集的时间复杂度。

首先对于一般图,求独立集属于 NP 完全问题,也就是只能暴力枚举。

对于二分图,设点数 n n n,边数 m m m,则可以使用网络流将复杂度变成 O ( m n ) O(m \sqrt n) O(mn ) 的级别(网络流还没学过qwq)。

对于仙人掌图,也包含了树和基环树,可以使用深搜树 + dp 的方式把复杂度变成 O ( n + m ) O(n+m) O(n+m) 的级别。

对仙人掌图进行缩点

发现仙人掌是一堆环通过一堆边拼在一起,两两之间彼此不相交。显然会发现,这个时候若把每一个环都看作是一个点,那么最终就会变成一棵树,在上面可以跑各种各样的科技。

那么怎么看作是一个点呢???通过 P5236 的圆方树做法,我们想到了可以配合点双连通分量进行缩点。

考虑仙人掌图中的每一个点双,不难发现是这样子的:

  • 每一个点双恰好是一个简单环,或者是恰为一条非环边。

显然简单环一定是极大的点双连通分量,但是剩下的边中的每一条边也会变成一个点双连通分量,所以上面的那句话是正确的。

例如这个仙人掌图的深搜树,树边用实线,回边用虚线:

所有的点双连通分量现在已经用彩色线圈出来了,在旁边写上了新的编号。

最终得到的园方树如下:

以前我们就知道圆方树有着求必经点和可经点的作用,但是在对仙人掌图缩点的时候它会有更大的作用。

观察绿色点双连通分量,发现其 u p up up 结点为 3 3 3 号结点(这里 u p up up 结点为点双连通分量最高的结点,而 d n dn dn 结点为点双连通分量最低的结点),而对应到圆方树里面,发现 3 3 3 就是其父亲!

整理一下可得:

新性质:圆方树里方点的父亲恰好是深搜树中其对应的点双里最高的点。


考虑另一件事情:如何处理环上两点之间的最短距离。

不妨在圆方树里面,针对 14 14 14 号方点进行举例,即原深搜树中的绿色点双连通分量的部分。后面的抽象文字如果有不懂的可以对照着图片想想为什么。

因为获取距离的方法较为套路,这里就简要讲讲思考在这个方法的过程。

发现一个环一定是一条链加上一条回边,这是不由分说地。而且还可以发现两点之间的距离要么是在这条构成环的链上的距离(也就是直接从深度小的点通过走链走到深度大的点),要么是从另一个方向过来的距离(也就是先从深度小的点走到 u p up up,然后再走 d n dn dn,再有 d n dn dn 走到深度较大的点)

显然两点之间的最短距离就是上面两片粗体字得到答案的 min ⁡ \min min 值。但是这两个答案太难算了,有没有一些突破口呢?

显然是有的,因为我们可以发现第一托路径的答案 + + + 第二托路径的答案 = = = 整个环的路径权值和。

那么就可以通过路径权值和来快速通过前者得到后者。而且路径权值和是一个定值,因为其他地方没地方放了,就直接把环里面的路径权值和作为这个环对应的方点的点权即可。

而对于前面提到的第一托可能的路径,可以使用在链上 u p up up 到这个点的距离来记录。这样就做完了。最终还有每一个方点到其 u p up up 的距离设为 0 0 0

总结一下:

  • 方点到其 u p up up 的边权设为 0 0 0

  • 圆点到方点的边权,设为在深搜树中方点的 u p up up 到圆点的链上距离。

  • 将方点的点权设为环内所有边权的总和。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2387655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为高斯数据库(GaussDB)深度解析:国产分布式数据库的旗舰之作

高斯数据库介绍 一、高斯数据库概述 GaussDB是华为自主研发的新一代分布式关系型数据库&#xff0c;专为企业核心系统设计。它支持HTAP&#xff08;混合事务与分析处理&#xff09;&#xff0c;兼具强大的事务处理与数据分析能力&#xff0c;是国产数据库替代的重要选择。 产…

LWIP 中,lwip_shutdown 和 lwip_close 区别

实际开发中&#xff0c;建议对 TCP 连接按以下顺序操作以确保可靠性&#xff1a; lwip_shutdown(newfd, SHUT_RDWR); // 关闭双向通信 lwip_close(newfd); // 释放资源

xml双引号可以不转义

最近在开发soap方面的协议&#xff0c;soap这玩意&#xff0c;就避免不了XML&#xff0c;这里我用到了pguixml库。 输入了这个XML后&#xff0c;发现<和>都被转义&#xff0c;但是""没有被转义&#xff0c;很是奇怪啊。毕竟去网上随便一搜转义字符&#xff0c…

兰亭妙微 | 图标设计公司 | UI设计案例复盘

在「33」「312」新高考模式下&#xff0c;选科决策成为高中生和家长的「头等大事」。兰亭妙微公司受委托优化高考选科决策平台个人诊断报告界面&#xff0c;核心挑战是&#xff1a;如何将复杂的测评数据&#xff08;如学习能力倾向、学科报考机会、职业兴趣等&#xff09;转化为…

OpenCV视觉图片调整:从基础到实战的技术指南

引言:数字图像处理的现代意义与OpenCV深度应用 在人工智能与计算机视觉蓬勃发展的今天,图像处理技术已成为多个高科技领域的核心支撑。根据市场研究机构Grand View Research的数据,全球计算机视觉市场规模预计将从2022年的125亿美元增长到2030年的253亿美元,年复合增长率达…

手机收不到WiFi,手动输入WiFi名称进行连接不不行,可能是WiFi频道设置不对

以下是电脑上分享WiFi后&#xff0c;部分手机可以看到并且能连接&#xff0c;部分手机不行&#xff0c;原因是&#xff1a;频道设置为5GHz&#xff0c;修改成&#xff0c;任何可用频率&#xff0c;则可

批量文件重命名工具

分享一个自己使用 python 开发的小软件&#xff0c;批量文件重命名工具&#xff0c;主要功能有批量中文转拼音&#xff0c;简繁体转换&#xff0c;大小写转换&#xff0c;替换文件名&#xff0c;删除指定字符&#xff0c;批量添加编号&#xff0c;添加前缀/后缀。同时还有文件时…

ATPrompt方法:属性嵌入的文本提示学习

ATPrompt方法:属性嵌入的文本提示学习 让视觉-语言模型更好地对齐图像和文本(包括未知类别)。 一、问题场景:传统方法的局限 假设你有一个模型,能识别图像中的物体并关联到文本标签(如“狗”“猫”)。 传统方法: 用“软提示”(可学习的文本标签)和“硬类别标记”…

14.「实用」扣子(coze)教程 | Excel文档自动批量AI文档生成实战,中级开篇

随着AI编程工具及其能力的不断发展&#xff0c;编程将变得越来越简单。 在这个大趋势下&#xff0c;大师兄判断未来的编程将真正成为像office工具一样的办公必备技能。每个人通过 &#xff08;专业知识/资源编程&#xff09;将自己变成一个复合型的人才&#xff0c;大大提高生…

对于geoserver发布数据后的开发应用

对于geoserver发布数据后的开发应用 文章目录 对于geoserver发布数据后的开发应用[TOC](文章目录) 前言一、geosever管理地理数据的后端实用方法后端进行登录geoserver并且发布一个矢量数据前置的domain数据准备后端内容 总结 前言 首先&#xff0c;本篇文章仅进行技术分享&am…

基于Qlearning强化学习的二阶弹簧动力学模型PID控制matlab性能仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 传统PID控制器 2.2 Q-Learning强化学习原理 2.3 Q-Learning与PID控制器的融合架构 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2024B仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&a…

【AS32X601驱动系列教程】SMU_系统时钟详解

在现代嵌入式系统中&#xff0c;时钟与复位管理是确保系统稳定运行的关键。我们的SMU&#xff08;系统管理单元&#xff09;模块专注于此核心任务&#xff0c;通过精准的时钟配置和复位控制&#xff0c;为整个系统提供可靠的时序保障。 SMU模块的主要功能是完成时钟和复位的管…

09 接口自动化-用例管理框架pytest之allure报告定制以及数据驱动

文章目录 一、企业级的Allure报告的定制左边的定制&#xff1a;右边的定制&#xff1a;1.用例的严重程度/优先级2.用例描述3.测试用例连接的定制4.测试用例步骤的定制5.附件的定制 二、企业中真实的定制有哪些&#xff1f;三、allure报告如何在本地访问四、allure中的数据驱动装…

React笔记-Ant Design X样本间对接智谱AI

目标 后端对接是智谱AI。 过程 先把Ant Design X样本间搭建好&#xff0c;通过此篇博文获得智谱AI的URL等 智谱AI开放平台 看下此篇博文的“使用API接入” 通义千问 - Ant Design X 将样本间代码的&#xff1a; const [agent] useXAgent({request: async ({ message }, { …

网络安全-等级保护(等保) 3-2 GB/T 28449-2019《信息安全技术 网络安全等级保护测评过程指南》-2018-12-28发布【现行】

################################################################################ GB/T 28448-2019 《信息安全技术 网络安全等级保护测评要求》规定了1~4及的测评要求以及对应级别云大物移工的测评扩展要求&#xff0c;与GB/T 22239-2019 《信息安全技术 网络安全等级保护…

【Bug】--node命令加载失败

环境&#xff1a;本地已经安装好了nodejs&#xff0c;并且已经加入了环境变量path 报错&#xff1a; (解释器) PS D:\桌面文件\pythonProject\vue-fastapi-admin\web> npm i -g pnpm npm : 无法加载文件 D:\桌面文件\node-v22.14.0-win-x64\node-v22.14.0-win-x64\npm.p…

Java 大视界 -- 基于 Java 的大数据分布式存储在视频会议系统海量视频数据存储与回放中的应用(263)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

ROS云课三分钟-3D性能测试supertuxkart和游戏推荐等-国际象棋

ROS云课三分钟-破壁篇GCompris-一小部分支持Edu应用列表-2025-CSDN博客 很多时候&#xff0c;有一种思维定势&#xff0c;将人锁住&#xff0c;人口就是囚。 口人囚~口加人等于囚-CSDN博客 如果突破&#xff0c;跳出问题&#xff0c;再看问题。 这门课程&#xff0c;或者这个平…

汽车零部件行业PLM案例:得瑞客汽车(Dereik) 部署国产PLM

2024年&#xff0c;昆山得瑞客汽车零部件有限公司&#xff08;以下简称“得瑞客汽车”&#xff09;签约智橙云PLM&#xff08;智橙PLM&#xff09;&#xff0c;近日&#xff0c;双方启动了PLM项目评估会&#xff0c;商讨在汽车零部件行业研发数字化转型领域进行更深层的合作。 …

Web攻防-SQL注入数据格式参数类型JSONXML编码加密符号闭合

知识点&#xff1a; 1、Web攻防-SQL注入-参数类型&参数格式 2、Web攻防-SQL注入-XML&JSON&BASE64等 3、Web攻防-SQL注入-数字字符搜索等符号绕过 案例说明&#xff1a; 在应用中&#xff0c;存在参数值为数字&#xff0c;字符时&#xff0c;符号的介入&#xff0c…