gpt4 book ai didi

关于基环树的一切

转载 作者:撒哈拉 更新时间:2024-04-07 20:44:58 60 4
gpt4 key购买 nike

观前须知

笔者的博客主页

声明

本文使用 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})\),然后对每个基环树求和即可.

最后此篇关于关于基环树的一切的文章就讲到这里了,如果你想了解更多关于关于基环树的一切的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com