基环树学习笔记

news/2025/11/4 13:39:46/文章来源:https://www.cnblogs.com/CuteNess/p/19190036

基环树学习笔记

往一个树上额外添加一条边,称得到的图为基环树。

基环树点数和边数相同,但是点数和边数相同的图不一定是基环树。

另外,满足以下性质的图是基环森林(当联通时是基环树):

  • 每个点有且仅有一条出边,这时候称得到的图为外向基环森林。
  • 每个点有且仅有一条入边,这时候称得到的图为内向基环森林。

对基环树通常的处理方法有两种。

第一种是任意断开环上的一条边,当作树上问题做。最后再考虑这条边对答案的影响。

第二种是断开环上的所有边,对得到的所有树处理得到根的答案,转化成环上的问题。

实现上,可以用 dfs 找出环,然后正常做。或者是在拓扑排序的过程中维护。


例题:

P4381 [IOI 2008] Island

求基环树的直径。

将环全部断开,求出每个子树内的最大值。dp 可以直接求出。

\(d_x\) 表示 \(x\) 子树内的最深点的深度。

取环上任意一点 \(p\),从 \(p\) 点处断开得到链。令 \(s_x\) 表示 \(x\) 点在这条链上到 \(p\) 的距离。

那么经过环的最长距离就是

\[\max_{s_y>s_x} d_x+d_y+\max(s_y-s_x,s_x-s_y+\text{len}) \]

拆开可以直接线性维护。

code
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>const int N = 1e6 + 7;
typedef long long i64;namespace wyx {int n, deg[N];
std::vector<std::pair<int, int>> g[N];
i64 dp[N], de[N], ans;inline void pushup(int u) {dp[u] = 0;for(auto& [v, w]: g[u]) {if(deg[v] == 1) {dp[u] = std::max(dp[u], dp[v]);dp[u] = std::max(dp[u], de[u] + de[v] + w);de[u] = std::max(de[u], de[v] + w);}}
}void toposort() {std::queue<int> q;for(int i = 1; i <= n; ++i) {if(deg[i] == 1) {q.push(i);}}while(!q.empty()) {int u = q.front(); q.pop();pushup(u);for(auto& [v, w]: g[u]) {if(--deg[v] == 1) q.push(v);}}
}inline void solve(int x) {i64 res = 0;i64 a1 = -1e18, a2 = -1e18, b1 = -1e18, b2 = -1e18, pre = 0;int y = x;while(x) {deg[x] = 0;int nv = 0, nw = 0;for(auto& [v, w]: g[x]) {if(deg[v] == 2) {nv = v, nw = w; break;} }pushup(x);res = std::max(res, dp[x]);b1 = std::max(b1, a1 + de[x] + pre);b2 = std::max(b2, a2 + de[x] - pre);a1 = std::max(a1, de[x] - pre);a2 = std::max(a2, de[x] + pre);if(!nv) {std::reverse(g[x].begin(), g[x].end());for(auto& [v, w]: g[x]) {if(v == y) { pre += w; break; }}break;}pre += nw, x = nv;}res = std::max(res, std::max(b1, b2 + pre));ans += res;
}inline void main() {std::cin >> n;for(int i = 1; i <= n; ++i) {int x = i, y, z;std::cin >> y >> z;g[x].emplace_back(y, z);g[y].emplace_back(x, z);++deg[x], ++deg[y];}toposort();for(int i = 1; i <= n; ++i) {if(deg[i] == 2) {solve(i);}}std::cout << ans << "\n";	
}};int main() {std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);wyx::main();
}

P2607 [ZJOI2008] 骑士

求基环树上最大独立集。

树内用类似上一题的方法处理。

环上的部分,可以从任意边 \(x \rightarrow y\) 断开。

dp 时钦定 \(x\) 选/不选,dp\(y\) 的状态时合并答案。

code
#include <algorithm>
#include <iostream>
#include <queue>
#include <tuple>namespace wyx {const int N = 1e6 + 7;typedef long long i64;
int n, deg[N]; i64 dp[N][2], w[N];
std::basic_string<int> g[N];inline void pushup(int u) {dp[u][0] = 0, dp[u][1] = w[u];for(int& v: g[u]) {if(deg[v] == 1) {dp[u][0] += std::max(dp[v][0], dp[v][1]);dp[u][1] += dp[v][0];}}
}inline void toposort() {std::queue<int> q;for(int i = 1; i <= n; ++i) {if(deg[i] == 1) q.push(i);}while(!q.empty()) {int u = q.front(); q.pop();pushup(u);for(int& v: g[u]) {if(--deg[v] == 1) q.push(v);}}
}i64 ans = 0;
inline void solve(int x) {auto findnext = [](int x) { for(int& v: g[x]) if(deg[v] == 2) return v; return 0; };i64 dp[2][2];pushup(x);dp[1][1] = wyx::dp[x][1], dp[0][0] = wyx::dp[x][0];dp[1][0] = dp[0][1] = -1e18;	deg[x] = 0, x = findnext(x);while(x) {pushup(x);for(int k = 0; k < 2; ++k) {std::tie(dp[k][0], dp[k][1]) = std::make_pair(std::max(dp[k][0], dp[k][1]) + wyx::dp[x][0], dp[k][0] + wyx::dp[x][1]);}deg[x] = 0, x = findnext(x);}		i64 res = std::max({dp[0][0], dp[0][1], dp[1][0]});ans += res;
}inline void main() {std::cin >> n;for(int y, i = 1; i <= n; ++i) {std::cin >> w[i] >> y;g[i] += y, g[y] += i;++deg[i], ++deg[y];}toposort();for(int i = 1; i <= n; ++i) {if(deg[i] == 2) {solve(i);}}std::cout << ans << "\n";
}};int main() {std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);wyx::main();
}

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

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

相关文章

【A】nice try

CF1787I Treasure Hunt 容易发现,他的限制其实是无用的。考虑 \(l\le q\le r\) 的情况,他的贡献是 \(s_r+s_q-s_l\),那么我们可以将 \(s_r,s_q\) 中的较小者调整为较大者,那么一定会满足 \(r\le q\) 的限制。 所以…

Towards All-in-One Medical Image Re-Identification

[CVPR25] 多模态医学图像检索实现隐私保护Towards All-in-One Medical Image Re-Identification MaMI:一个模型实现多模态的医学图像重识别 代码仓库 动机 所谓重识别(Re-Identification)在本文的语境中指的是:在数…

day01-Markdown学习

day01-Markdown学习小白继续坚持。Markdown学习 总结标题用 :#个数来表示字体用 :*斜体 **粗体 --画掉引用 :>+空格分割线:~~~或***图片:![名字](网址或内存地址)超链接:[内容](网址)列表:有序:1.+空…

2025年11月深圳离婚房产律师机构评测:综合实力与服务质量榜

在深圳这座快节奏的现代化都市,婚姻关系的变故往往伴随着复杂的财产分割问题,其中房产因价值高、情感因素重而成为争议焦点。选择一家专业的律师事务所来处理离婚房产纠纷,对于保障自身合法权益、降低诉讼风险至关重…

2025年11月深圳离婚房产律所综合评测:服务特色与专业能力深度对比

在深圳这座现代化大都市,随着社会经济发展和人们观念的变化,离婚案件中涉及房产分割的需求日益增多。选择一家专业的律师事务所来处理离婚房产问题,成为许多面临婚姻变故人士的重要决策。这类用户通常处于情感脆弱期…

jiangly模板-数学(数论,几何,多项式)

数学 快速幂 /** 快速幂 - 普通版* 2023-10-09: https://atcoder.jp/contests/tenka1-2017/submissions/46411797 **/ int power(int a, i64 b, int p) {int res = 1;for (; b; b /= 2, a = 1LL * a * a % p) {if…

vimrc 插件使用

ack.vim https://github.com/mileszs/ack.vim在Vim中运行你最喜欢的搜索工具,并获得增强的结果列表。 此插件旨在作为程序员搜索工具ack的Vim前端。ack可以替代99%的grep使用场景。该插件允许您在Vim中使用ack进行搜索…

Java中的委托和拉姆达(表达式/语句)

Java中的委托和拉姆达(表达式/语句)所谓委托,主要指函数声明的一种方式。通常在函数作为参数时使用。 Java中现成的委托,语法还是比较啰嗦的。可以看到,对不同个数的参数和返回值,有不同的写法。我们这里举个例子…

国债ETF收益规律发现及应用

国债ETF收益规律发现及应用利率下行的年代,国债在投资可选项中的重要性也显著提升了,本文研究国债ETF涨跌规律,以及能否利用规律提高收益。研究数据:十年期国债, 代码:511260日线数据时间范围: 2017-08 到 2025…

2025年11月宝宝起名公司选择榜:舜缘居等五强对比解析

正在打开一份“起名焦虑”档案:预产期倒计时,出生医学证明必须填名字,长辈列了五行缺金、笔画要吉、读音要亮的三页纸,网上免费打分却一个90分都没有;户口登记窗口的民警提醒“一旦录入,变更要走公证”,于是“靠…

2025广东高端网站建设公司精选榜单:知名网站建设公司聚焦专业与适配的实用之选

在数字化转型加速推进的当下,无论是初创企业还是中小微机构,搭建专属网站已成为拓展业务、链接客户的核心需求。市场上不乏规模精简却专业高效的网站建设服务商,它们凭借灵活的服务模式、精准的需求适配能力,为不同…

2025年11月自吸泵厂家评价榜:主流厂商数据解析与推荐

自吸泵是市政排水、农田灌溉、工业循环水系统的“心脏”,用户往往在“临时应急”或“项目节点”前两周才集中选型,痛点集中在“是否真自吸”“能否扛住空转”“交货期是否准时”“售后能否到场”四件事。2025年住建部…

2025年11月治疗失眠的专家推荐:市场报告与选择指南

失眠不是简单的“睡不着”,而是白天效率下滑、情绪易崩、体检指标飘红的连锁反应。很多人半夜刷手机找“快速入睡偏方”,第二天却带着更深的黑眼圈上班;也有人把希望寄托于褪黑素、香薰、白噪音,结果依旧凌晨三点数…

2025年11月自吸泵厂家推荐列表:主流企业口碑与资质全解析

引言与现状分析 在市政排涝、工厂循环、农业灌溉等场景里,自吸泵因“无需灌引水、吸程高、维护快”成为刚需。用户通常面临三大痛点:一是参数虚标,实际吸程比铭牌低一到两米;二是配件不通用,后期维护被“绑架”;…

2025年11月治疗失眠的专家推荐:市场报告与榜单全解析

凌晨两点仍盯着天花板、白天靠咖啡续命、体检报告却显示“未见明显异常”——这是当下中国3亿睡眠障碍者的共同画像。国家卫健委2024年抽样显示,18-60岁人群里,有失眠症状者占38.2%,其中仅11.7%得到规范干预。政策层…

2025年11月中国婚姻家事与财富管理律师评价榜:五强深度评测

当婚姻、继承、股权、跨境资产交织成一张越来越复杂的财富网络,高净值家庭最先想到的不是“打官司”,而是“找谁才能一次性把风险拆干净”。2025年,北京、上海、深圳三地法院公开数据显示,婚姻家事案件标的额超过一…

2025不锈钢提升机厂家选购参考:专注实用的优质厂家与选择逻辑

在工业生产的物料输送环节中,提升机作为关键设备,其性能稳定性直接影响生产效率。随着市场需求升级,兼具可靠性与适配性的提升机品牌逐渐成为行业关注焦点。结合市场调研与实际应用反馈,以下为大家梳理优质提升机厂…

2025制造业刮板输送机厂家选型参考:皮带输送机厂家供应商及选购要点解析

在工业生产的物料转运环节,输送机作为核心设备直接影响生产效率与运营成本。随着制造业智能化、定制化需求升级,选择适配的输送设备及可靠供应商成为企业关注的重点。以下结合行业观察,分享优质输送机供应商特点及实…

2025年11月中国婚姻家事与财富管理律师排名榜:五强对比指南

引言与现状分析 当婚姻、继承、股权、跨境资产交织在一起,高净值家庭最先想到的求助对象往往是“婚姻家事与财富管理律师”。2025年,中国个人可投资资产超过1000万元的家庭已突破220万户,北京、上海、深圳三地集中了…

Let`s Encrypt 生成免费自动续签 HTTPS 证书

Let`s Encrypt 是一个免费的证书授权机构(CA),其通过 ACME 协议接口自动签发数字证书,来让你省去证书过期的烦恼。 ACME客户端有很多,Let`s Encrypt 官网推荐 Certbot ,下面是具体获取免费证书的流程: 一、安装…