首页 > 其他分享 >关于基环树的一切

关于基环树的一切

时间:2024-04-07 19:33:23浏览次数:28  
标签:cnt 一切 fa ++ 基环树 int dfn 关于

观前须知

笔者的博客主页

声明

本文使用 CC BY-NC-SA 4.0 许可

本文为笔者在 OI 学习中的复习向学习笔记。
部分内容会比较简略。
如有好的习题会不断补充。

知识简介

定义

基环树是一个有 \(n\) 个点 \(n\) 条边的连通图。
因为有 \(n\) 个点 \(n-1\) 条边。
所以基环树可以看作是加了一条边的树。
那么也就是加了个环的树
注意:题目中给 \(n\) 点 \(n\) 边时可能是基环树,也可能是基环树森林。
后一种情况分连通分量分别做即可。

如图:

基环树

拓扑排序找环

无向图:
不断地删除 1 度点,直到留下的全部都是 2 度点,即为环。

有向图:
同上,只不过每次删入度为 0 的点。

DFS找环

无向图:
走的时候记 dfn 和 fa,
遇到遍历过且 dfn 大的点(防止重复计算),
就不断跳 fa 并记录。

代码:

void Dfs(int u) {
    dfn[u] = ++Time;
    for (int i = head[u]; i; i = e[i].nxt) {
        int v = e[i].v;
        if (v == fa[u]) continue;
        if (!dfn[v]) { fa[v] = u, Dfs(v); }
        else {
            if (dfn[v] < dfn[u]) continue;
            loop[++cnt] = v;
            while (v != u) loop[++cnt] = v = fa[v];
        }
    }
}

有向图:
如果边指向叶子可以反过来。
边指向根的树只需要不断向上跳 fa,同时打标记,
直到跳到树的根后,再跳到的点已经打过标记了,那么就找到环了。
(如果要树型DP的话可以再建个反向图,就不用建双向图了)

代码:

while (!vis[x]) vis[x] = true, x = fa[x];
int v = x;
while (v != x) loop[++cnt] = v = fa[v];

基环树常见问题处理方式

把环断开,发现图变成了若干个森林
那么可以把基环树看作用一个环连接着的若干棵树。
这时候就可以先断环,然后再树型DP了。
特别地,有些题涉及到树之间经过环的转移。
这类问题可以分类讨论成不经过环的和经过环的分别处理。
由于有环的出现,破环为链也比较常用。

习题

Luogu P2607 【ZJOI2008】 骑士

首先这个东西显然可以树型DP做。
但是这里是个基环树森林。
发现对于环的任意两个相邻点只能二选一或都不选。
那么任取环上的两个点分别做树型dp取 \(\max(f_{u_1,0},f_{u_2,0})\),然后对每个基环树求和即可。

标签:cnt,一切,fa,++,基环树,int,dfn,关于
From: https://www.cnblogs.com/Sugar-Cube/p/18119741

相关文章

  • 28个关于PHP核心技术的面试题,助力跳槽!
    1oop是什么?答:oop是面向对象编程,面向对象编程是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP具有三大特点1、封装性:也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一......
  • 【C#】关于WCF你需要知道的!
    虽然WCF(WindowsCommunicationFoundation)已经不在是C#的最新技术,但很多老项目依然在用WCF。这边文章会让你快速知道WCF相关的知识。1.环境以下是我的开发环境:VisualStudio2017Dotnetframework4.8 记得启动WindowsFeatures.   2.一个简单的WCF案例微......
  • 关于layui的单图片上传遇坑-field-input-name问题解决
    直接上代码注意field:'ymftimage'layui.use(function(){varupload=layui.upload;varlayer=layui.layer;varelement=layui.element;var$=layui.$;//单图片上传varuploadInst=upload.render({elem:'#ID-upload-demo-btn',......
  • 关于开机启动-注册表项
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\serializeDWORD值“,并将其命名为”StrtupDelayInMSec“,=》0BootExecute:路径为HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager,这个键包含了在Windows启动时执行的命令。你可以......
  • 关于Axios的异域问题
    需要建一个类,在类中修改需要访问的前端端口: 代码如下:importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.cors.CorsConfiguration;importorg.springframework.web.cors.UrlB......
  • 关于复读机加强版的一些小讨论
    我是复读机,所以复读EIEditorial。本题做\(d=6\)的关键点是注意到\(\omega_6^2=\omega_6-1\)。如何批量生产这种神奇等式呢。事实上,总是可以用成\(\phi(d)\)个\(d\)阶单位根的线性组合表示出所有的\(d\)阶单位根,甚至这是一组最小的基底。具体怎么构造呢?考虑构造\(\p......
  • 关于复杂IT系统项目需求管理的一些经验分享
    在复杂信息化系统的建设过程中,需求管理无疑是项目管理的核心环节之一,对于项目的成功至关重要。在项目实践中,我遇到了不少关于需求管理的问题,也积累了一些解决这些问题的经验和方法。一、需求管理中常见的问题1、需求模糊不清在与客户或业务部门的沟通中,经常会遇到需求表述不明......
  • 关于树的直径的一切
    观前须知本文使用CCBY-NC-SA4.0许可本文所有详细证明可见OIWiki笔者的博客主页正文定义树的直径指树上任意两点间距离的最大值两次DFS先以任意点为根找到最远点\(v\)再以\(v\)为根找到最远点\(u\)\(u-v\)即为该树的一条直径适用范围:无负权树证明:当\(v\)......
  • 关于pwn题的栈平衡中ret的作用
    以nssctf里的where_is_my_shell为例题目提供了一个system函数,和一个buf数组。数组的栈空间如图所示,这里不讨论怎么解题,只说明payload里的ret的作用。假设没有ret,栈溢出到ret的时候内容如下:第一个八字节:(图示位置)存储poprdi;ret;的地址它下面的八个字节存储要pop的参数。......
  • 关于 VScode, 点击文件右键或者在文件夹中没有 【 在vscode中打开选项】 解决办法
    关于VScode,点击文件右键或者在文件夹中没有【在vscode中打开选项】解决办法段子手-1682024-4-61、在任意位置创建一个文本文件。如:a.txt2、复制以下代码到a.txt文本文件中。(注:以;开头的,是备注信息,不需要做任何修改)WindowsRegistryEditorVersion......