首页 > 其他分享 >基环树

基环树

时间:2024-07-21 10:41:36浏览次数:10  
标签:环上 题解 sum len 基环树 环边

定义

(图片来自这篇文章

  • 基环树: 有 \(n\) 个点 \(n\) 条边的连通图
    image

  • 外向树: 每个点出度为 \(1\)

image

  • 内向树: 每个点入度为 \(1\)

image

找环

  • \(dfs\)

image

  • 拓扑排序

image

一般处理方法

因题而异,一般有两种常用的

  • 第一种是先断掉环边,把环上点当作根,处理每一棵子树,再在环上处理,可能需要环形 \(DP\)。

  • 第二种是选择一条环边断掉,化成树上问题,可能需要枚举断边,或者换根 \(DP\)。

具体还是看题吧

例题

简要题解

考虑一条边链接的两个点不能同时选,随便找一条环边\(u - v\)断开,强制\(u\) 不选,强制 \(v\) 不选,两种情况取 \(max\)

求基环树森林的直径和,边带权

简要题解

只考虑一棵基环树

直径可能过环,也可能不过环,两种情况取最大值

把环找出来,先删去环边,找每棵子树的直径最大值

再考虑如果经过一段环边,那么就是经过环上两点的路径和这两个点子树内最长链之和的最大值

考虑如何处理这个环上问题

两点间距离快速求解需要前缀和,那么答案可以写成

\(max(len_i + len_j + sum_i - sum_j) (i > j)\)

也即

\(max(len_i + sum_i, len_j - sum_j) (i > j)\)

但是环上有两个方向呢?

你发现另一个方向其实就是

\(max(sum + len_i - sum_i, len_j + sum_j) (i > j)\)

取 \(len_i + sum_i\) 的最值和 \(len_i - sum_i\) 的最值即可

简要题解

\(m = n - 1\),是一棵树,直接排序后按照 \(dfs\) 序输出即可

\(m = n\),基环树,发现环边一定不会全走,可以枚举环边断开,比较字典序取最小的即可

  • 加强版

\(n \leq 500000\)

题解

简要题解

先考虑在树上怎么做

一个点会贡献到一条链上

树上差分

环上呢?

考虑每个点会贡献到环上的一段,仍然可以对环进行差分处理

标签:环上,题解,sum,len,基环树,环边
From: https://www.cnblogs.com/Chencgy/p/18310707

相关文章

  • 基环树
    基环树定义在树形结构中添加一条边形成的图。分类无向图基环树内向基环树,每个点的出度为1。外向基环树,每个点的入度为1。找环:方法1:无向图基环树找环。拓扑排序,去掉环以外的点,剩下的就是一个那个环。方法2:有向图和无向图均适用。原理:在搜索树中检查一个点\(x\)的......
  • 基环树
    在树形结构中添加1条边形成的图分类:1.无向图基环树2.内向基环树,每个点出度为1的情况一棵内向基环树3.外向基环树,每个点入度为1的情况找环方法1:无向基环树找环1.统计节点的度数deg[i]2.将度数为1的点入队3.循环从队首取出节点x并将x的邻接点y度数减14.若deg[y]==1......
  • 基环树和笛卡尔树
    基环树就是比平常的树多一条边,有\(n\)条边,也就有一个环在里面。基本思想就是断环,跑树形\(dp\),或者用拓扑排序判环去跑环形\(dp\)。树的直径今天才了解到的,用两遍\(dfs\)跑。首先第一遍找到离根节点最远的节点\(u_1\),然后再从\(u_1\)找到离它最远的节点\(u_2\),那么......
  • 基环树和笛卡尔树
    1.基环树定义:有\(n\)个点和\(n\)条边的图,就是给树连了一条边,此时图中恰好只有一个环解决这类问题时,通常断环,变成普通的树的问题,然后再特殊处理环P2607[ZJOI2008]骑士click断环成树后就跟没上司一样是个树形dp,注意森林,longlong就行了,具体细节见这里P5022[NOIP2018提高组......
  • 基环树
    基环树1.定义基环树是一个由n个点及n条边组成的连通图,其比树多出一条边,所以称作基环树。2.分类基环树分为无向基环树和有向基环树。而有向基环树又分为内向基环树和外向基环树。内向基环树,即每个点出度为1的基环树;外向基环树,即每个点入度为1的基环树。3.解决方式对于有关......
  • 基环树
    基环树的定义为:一个有向或无向图中,只含有一个环的图,形式化的表达为:关于这种形状关键点主要在于找环,那么我们可以一步一步的去寻找,当这个点走着走着走到了某个环里,我们可以直接遍历整个环,然后打个标记,这样环就找到了具体的例题:E-ReachabilityinFunctionalGraph本题就是一......
  • 基环树找环
    abc167_dTeleporter#include<bits/stdc++.h>#defineptprintf(">>>")#definemid(((l)+(r))/2)usingnamespacestd;typedeflonglongll;typedeflongdoubleld;constllN=1e6+10,inf=1e18+10,mod=1e9+7;vector<ll>G[N];map&......
  • 置换 & 基环树题
    T1Statement给一个长度为\(n(\le10^5)\)的排列\(\{a_i\}\)。求一个排列\(\{b_i\}\),使得\(a_i=b_{b_i}\),或输出不存在。Solution先把所有排列变成置换对于任意排列\(\{p_i\}\),它转成置换后都是\(i\top_i\),故有\(i\top_i\top_{p_i}\top_{p_{p_i}}\to...\)所以所有......
  • 基环树算法总结
    基环树算法总结一、什么是基环树基环树,顾名思义,有两个要素:环和树。因此,基环树就是一棵树的一个节点,扩成一个环,做题时,多棵基环树组成的基环树森林,常以如下方式出现:每个点只有一个出边。每个点只有一个入边。图中一共有\(n\)个点,\(n\)条边。那么,基环树类型的题目应该怎......
  • 基环树
    byDuck.感觉都是神秘乱搞。一般的处理方式:把整个环当成根。断环。CF711DDirectedRoads正难则反,考虑统计成环的数量。我们先把环搜出来,那么环上的边只能有全部顺时针或者全部逆时针两种方向,环外的边任意。设环长为\(L\),那么就有\(2^{n-L}\times2\)种有环的情况,从而......