部分树上问题及图的联通性(图论学习总结部分内容)

前言

由于图论学习总结内容过多,全放在一篇博客过于冗长现进行拆分,本文是部分树上问题及图的联通性部分,其他部分地址见:图论学习总结(For XCPC)

三、部分树上问题及图的联通性

最小生成树

知识点
  • K r u s k a l Kruskal Kruskal​ 算法
  • P r i m Prim Prim 算法
  • B o r u v k a Boruvka Boruvka​​​ 算法
  • 次小生成树
  • 瓶颈生成树
  • 最小瓶颈路
  • K r u s k a l Kruskal Kruskal 重构树
例题
e g 1 : eg1: eg1: 走廊泼水节(克鲁斯卡尔思想的灵活运用)

A-走廊泼水节(nowcoder.com)

题目大意

给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树。 求增加的边的权值总和最小是多少。

e g 2 : eg2: eg2 B-Picnic Planning

B-Picnic Planning (nowcoder.com)(码量较大)
题目大意

Picnic Planning

e g 3 eg3 eg3:L - Classic Problem(缩点+ B o r u v k a Boruvka Boruvka 算法, 2023 C C P C 2023CCPC 2023CCPC广东防AK题)

Problem - L - Classic Problem
题目大意

Given an undirected complete graph with n n n vertices and m m m triples P 1 , P 2 , ⋯   , P m P_1, P_2, \cdots, P_m P1,P2,,Pm where P i = ( u i , v i , w i ) P_i = (u_i, v_i, w_i) Pi=(ui,vi,wi), it’s guaranteed that 1 ≤ u i < v i ≤ n 1 \leq u_i < v_i \leq n 1ui<vin, and for any two triples P i P_i Pi and P j P_j Pj with different indices we have ( u i , v i ) ≠ ( u j , v j ) (u_i, v_i) \ne (u_j, v_j) (ui,vi)=(uj,vj).

For any two vertices x x x and y y y in the graph ( 1 ≤ x < y ≤ n 1 \leq x < y \leq n 1x<yn), define the weight of the edge connecting them as follows:

  • If there exists a triple P i P_i Pi satisfying u i = x u_i = x ui=x and v i = y v_i = y vi=y, the weight of edge will be w i w_i wi.
  • Otherwise, the weight of edge will be ∣ x − y ∣ |x - y| xy​.

Calculate the total weight of edges in the minimum spanning tree of the graph.

注:这题还未ac 先占坑

生成树计数

LCA、树上差分应用与树上问题

知识点
  • 树的直径

    • 树形DP
    • 两次 B F S BFS BFS (注意运用条件)
  • L C A LCA LCA

    • 树上倍增法
    • T a r j a n Tarjan Tarjan​ 算法 (离线算法)
  • 树链剖分

  • 树上hash

    • 在判断一些树是否同构时,常常把这些树转成哈希存储起来,降低复杂度
    • 这里给出 O I   W i k i OI\ Wiki OI Wiki 的推荐实现:
      树哈希
  • 树分治

例题
e g 1 : eg1: eg1: E. Boomerang(2024ICPC全国邀请赛(武汉),树的直径,银牌题)

E. Boomerang
题目大意
给定一个 n 个节点的树,根节点为 r, 设 V ( r , t ) = v ∣ d i s ( r , v ) ⩽ t V(r, t) = {v|dis(r, v) ⩽ t} V(r,t)=vdis(r,v)t,其中 d i s ( u , v ) dis(u, v) dis(u,v) 表示树上两点 u 和 v 间的唯一简单路径的边数。再给定一个 t 0 t_0 t0,对每个 k k k,你需要选择一个点 r ′ r' r,定义 V ′ ( r ′ , t ) = v ∣ d i s ( r ′ , v ) ⩽ k ( t − t 0 ) V'(r', t) = {v|dis(r', v) ⩽ k(t−t0)} V(r,t)=vdis(r,v)k(tt0)。找到一个最小的 t t t,使得 V ( r , t ) ⊆ V ′ ( r ′ , t ) V(r, t) ⊆ V'(r', t) V(r,t)V(r,t)
题目分析

  • 对题目进行分析,我们很容易想到一点,就是随着 k k k 的增大, t t t 非严格递减。
  • 我们考虑在 k = i ∈ [ 1 , n ] k=i \in [1,n] k=i[1,n] r ′ r' r 怎么选择会最优。
  • 假设 t t t 是一个可能的答案,那么显然,子树 V ( r , t ) V(r, t) V(r,t) 的直径的中点就是 r ′ r' r 的最佳选择。
  • 到这里,这道题的解法已经很明显了,我们可以维护出每个时刻 t t t,子树 V ( r , t ) V(r, t) V(r,t) 的直径是多少。
  • 从小到达枚举 t t t 判断在 k = i k=i k=i 的情况下是否满足条件。(这里在具体实现时用到了第一条提到的性质)
    参考了jls思路,ac代码(Python,FastIO已省略,其中手写栈 模板已给出):
# --------------------
# 手写栈模板
# 克服py栈太浅的问题
def bootstrap(f, stack=[]):
    def wrappedfunc(*args, **kwargs):
        if stack:
            return f(*args, **kwargs)
        else:
            to = f(*args, **kwargs)
            while True:
                if type(to) is GeneratorType:
                    stack.append(to)
                    to = next(to)
                else:
                    stack.pop()
                    if not stack:
                        break
                    to = stack[-1].send(to)
            return to

    return wrappedfunc


def solve():
    n = I()
    g = [[] for _ in range(n+1)]
    for _ in range(n-1):
        x,y = MI()
        g[x].append(y)
        g[y].append(x)
    r,t0 = MI()

    par, dep, h, dia = [0]*(n+1), [0]*(n+1), [0]*(n+1), [0]*n
    final = 0
    @bootstrap
    def dfs(x) -> None:
        nonlocal final
        v = [0,0]
        for y in g[x]:
            if y == par[x]: continue
            par[y] = x
            dep[y] = dep[x] + 1  # 深度
            yield dfs(y)
            d = h[y] + 1  # 高度
            for i in range(2):
                if d > v[i]: d,v[i] = v[i],d

        h[x] = v[0]
        dia[dep[x] + v[1]] = max(dia[dep[x] + v[1]], 2*v[1])
        final = max(v[0]+v[1], final)
        yield None
    dfs(r)

    for i in range(1,n):
        dia[i] = max(dia[i], min(dia[i-1]+1, final))
    for i in range(n-2,-1,-1):
        dia[i] = max(dia[i], dia[i+1]-2)

    t = t0
    ans = [0]*(n+1)
    for k in range(n,0,-1):
        while (t - t0) * k * 2 < dia[min(t, n-1)]:
            t += 1
        ans[k] = t

    print_arr(ans[1:])


solve()





e g 2 : eg2: eg2: 闇の連鎖 (树上差分)

闇の連鎖

题目大意

闇の連鎖

​ 根据题意,“主要边”构成一棵树,“附加边”是非树边。把一条附加边 ( x , y ) (x,y) (x,y) 添加到树上会构成一个环,如过一开始切断 x x x~ y y y 路径上的一条边,那么第二条必须切断 ( x , y ) (x,y) (x,y) 才能将 D a r k Dark Dark 分为不连通的两部分。我们可以考虑 ( x , y ) (x,y) (x,y) x x x~ y y y 路径上的树边覆盖了一次,那么如果我们第一次切掉覆盖数为 0 0 0 的树边, 那么之后切任意一条非树边即可,如果我们切掉覆盖数为 1 1 1 的树边,第二步的切分唯一,其余情况无法将 D a r k Dark Dark 分为不连通的两部分。

​ 由上述分析可知,我们要解决问题的模型就是在给定的一张无向图和一课生成树,求非树边将树边覆盖了多少次。解决这一问题的经典做法就是“树上差分”。给定每个结点的权值初值为 0 0 0,对于每条非树边 ( x , y ) (x,y) (x,y) 我们让 v a l x + = 1 ,   v a l y + = 1 ,   v a l l c a ( x , y ) − = 2 val_x+=1,\ val_y+=1,\ val_{lca(x,y)}-=2 valx+=1, valy+=1, vallca(x,y)=2,最后用树形DP做一次 “子树前缀和” 即可得到每条树边的覆盖次数,然后统计即可得到答案。

​ 关于时间复杂度:考虑用树上倍增法求 L C A LCA LCA,复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)。对于覆盖次数的预处理和答案求解需要遍历整张图,复杂度为 O ( n + m ) O(n+m) O(n+m)。总的时间复杂度为 O ( n + m + n log ⁡ n ) O(n+m+n\log n) O(n+m+nlogn)

启发: 如果我们需要对树上的一条路径的每条边加上一个 d d d,我们可以转化为 v a l x + = d ,   v a l y + = d ,   v a l l c a ( x , y ) − = 2 d val_x+=d,\ val_y+=d,\ val_{lca(x,y)}-=2d valx+=d, valy+=d, vallca(x,y)=2d

e g 3 : eg3: eg3: 天天爱跑步(蓝书例题)

E-天天爱跑步

e g 4 : eg4: eg4:​ 异象石(蓝书例题)

F-异象石_

e g 5 : eg5: eg5:​ 次小生成树(蓝书例题)

G-次小生成树_

e g 6 : eg6: eg6: 疫情控制(蓝书例题)

H-疫情控制_

基环树

e g 1 : eg1: eg1: Island (洛谷P4381 [IOI2008])

P4381 [IOI2008] Island - 洛谷

题目大意

岛屿
n n n 个点 n n n 条边,可以知道这题给你的是一个基环树森林,而根据题意中渡船的条件可知,当你从一棵基环树到另一棵的时候,你不能再回去了。所以我们可以对每个基环树单独计算。我们不能重复到达同一岛屿,所以我们要求的就是基环树上的一条最长简单路径的长度,那么所有基环树的和就是我们的答案。

​ 现在我们考虑每一棵基环树答案的情况1、不经过环(该情况可树形DP求解,即求树的直径)2、经过环。对于情况二我们要找到环上的两个结点 s i , s j s_i,s_j si,sj,使得 D [ s i ] + D [ s j ] + d i s t [ s i , s j ] D[s_i]+D[s_j]+dist[s_i,s_j] D[si]+D[sj]+dist[si,sj] 最大,其中 d i s t [ s i , s j ] dist[s_i,s_j] dist[si,sj] 是环上两点的距离,我们把环拆开复制一倍,再做线性 D P DP DP 即可求得答案,用单调队列优化,该DP时间复杂度为 O ( P ) O(P) O(P) P P P 为环的点数。总的时间复杂度为 O ( n ) O(n) O(n)

​ 关于实现,这道题需要 d f s dfs dfs b f s + 拓扑排序 bfs+拓扑排序 bfs+拓扑排序 找连通块和环,还要树形 D P DP DP 求直径,再对环做 D P DP DP 等等,常数比较大, 1 0 6 10^6 106 d f s dfs dfs 还可能爆栈c++实现如下:记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)(ac代码)

python实现如下:

记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

结果:

结果

e g 2 : eg2: eg2: 创世纪(蓝书例题)

B-创世纪

题目大意

创世纪

e g 3 : eg3: eg3: 牛镇公务员考试(2024牛客寒假营,基环树一般的处理方式)

K-牛镇公务员考试
题目大意

牛镇公务员考试

e g 4 : S u g a r   S w e e t I I eg4:Sugar\ Sweet II eg4:Sugar SweetII​ (基环树 + 概率,2023ICPC杭州站1/2个银牌题)

2023_ICPC_杭州站 - H - Codeforces

题目大意

Sugar is sweet. There are n n n children asking for sugar. Prof. Chen gives out sugar to the children. The i i i-th child initially has a i a_{i} ai bags of sugar. There are n n n events happening in uniformly randomized order. The i i i-th event is:

  • If the i i i-th child has strictly less bags of sugar than the b i b_{i} bi-th child, then the i i i-th child will get extra w i w_{i} wi bags of sugar. Otherwise, nothing happens.

Now, since the events happen in random order, Randias, which is the assistant of Prof. Chen, wants to know the expected number of bags of sugar each child will have after all the events happen.

It can be shown that the answer can be expressed as an irreducible fraction x y \frac{x}{y} yx where x x x and y y y are integers and y ≢ 0 ( m o d 1 0 9 + 7 ) y \not \equiv 0 \pmod {10^9 + 7} y0(mod109+7). Output the integer equal to x ⋅ y − 1 ( m o d 1 0 9 + 7 ) x \cdot y^{-1} \pmod {10^9 + 7} xy1(mod109+7). In other words, output such an integer a a a that 0 ≤ a < 1 0 9 + 7 0\leq a < 10^9 + 7 0a<109+7 and a ⋅ y ≡ x ( m o d 1 0 9 + 7 ) a \cdot y \equiv x \pmod {10^9 + 7} ayx(mod109+7)​.

Tarjan与无向图的连通性

注:python 的Tarjan算法与连通性相关代码模板和知识点可以看我的这篇博客

例题
e g 1 : eg1: eg1: 嗅探器

嗅探器

题目大意(来源:牛客网)

某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息,但是蓝军的网络相当的庞大,数据包从一个信息中心传到另一个信息中心可以不止有一条通路。现在需要你尽快地解决这个问题,应该把嗅探器安装在哪个中间服务器上才能保证所有的数据包都能被捕获?

input

输入文件的第一行一个整数 n   ( n ≤ 100 ) n\ (n\le 100) n (n100),表示蓝军网络中服务器的数目。
接下来若干行是对蓝军网络的拓扑结构描述,每行是两个整数 i , j i,j i,j,表示编号为i和编号为j的两台服务器间存在连接(显然连接是双向的),服务器的编号从 1 1 1 开始,一行两个 0 0 0 表示网络的拓扑结构描述结束,再接下来是两个整数 a , b a,b a,b,分别表示两个中心服务器的编号。

output

输出编号。如果有多个解输出编号最小的一个,如果找不到任何解,输出No solution。

题目解析

读完题目很容易想到这道题就是让我们求从 s s s t t t 的必经点或判断无解。首先,一个点如果是必经点,那么其必定是一个割点,如果这个割点将 s s s t t t​ 恰好分隔在两个双连通分量中,那么这就是我们答案的候选之一。

具体实现细节方面,我们可以从 s s s 出发对 T a r j a n Tarjan Tarjan 求割点的算法进行的时候做一个判断,看看搜索树中,如果当前点 x x x 是割点,且 x ! = s ,   x ! = t ,   d f n [ y ] ≤ d f n [ t ] x != s,\ x!=t,\ dfn[y]\le dfn[t] x!=s, x!=t, dfn[y]dfn[t] 。如果满足 d f n [ y ] ≤ d f n [ t ] dfn[y]\le dfn[t] dfn[y]dfn[t] 那么意味着从当前割点出发沿着 y y y 这一方向搜索树的子树中有 t t t,那么此时割点 x x x 必定是必经点。

e g 3 eg3 eg3 [ H N O I 2012 ] [HNOI2012] [HNOI2012]​​ 矿场搭建

[ H N O I 2012 ] [HNOI2012] [HNOI2012]​​ 矿场搭建
HNOI2012矿场搭建

Tarjan与有向图的连通性

注:python 的Tarjan算法与连通性相关代码模板和知识点可以看我的这篇博客

例题
e g 1 : eg1: eg1: [ZJOI2007] 最大半连通子图

ZJOI2007 最大半连通子图

练习题

B-树网的核_0x63 图论-树的直径与最近公共祖先

C-最优比率生成树_0x62 图论-最小生成树 (0/1分数规划)

D-雨天的尾巴 (树上差分的综合运用)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无线麦克风哪个好?无线麦克风如何选择?2024高品质产品推荐整理

​在如今的数字化时代&#xff0c;无线麦克风已经逐渐渗透到我们生活的方方面面。无论是专业的自媒体人、带货主播&#xff0c;还是日常生活中的普通用户&#xff0c;无线麦克风都发挥着不可或缺的作用。而在选择无线麦克风时&#xff0c;收音降噪效果和性价比无疑是大家最为关…

Electron下复用窗口关闭、最小化和最大化按钮

在macOS下&#xff0c;创建窗口时设置&#xff1a; new BrowserWindow({titleBarStyle: hidden, // 关闭默认的titlebartrafficLightPosition: { x: 18, y: 18 }, // 交通灯距离窗口左侧和窗口上侧的像素距离 })效果&#xff1a; 在window下可以这样设置&#xff0c; new Br…

Java基于Geth1.8实现节点同步、合约部署,以及踩坑记录—主节点控制台卡死、节点同步出错的解决方案

前言&#xff1a;本文将从一个区块链入门小白的视角&#xff0c;来一步步的讲解如何实现区块链数据上链&#xff0c;链上数据查询&#xff0c;geth多节点同步。以及讲解在上链过程中&#xff0c;我踩过的坑及其解决方案。如果有不对的地方&#xff0c;还请大佬指教&#xff01;…

白酒:酒精度数对白酒贮存老熟的影响研究

云仓酒庄豪迈白酒作为一种品质的白酒&#xff0c;其酒精度数对白酒贮存老熟的影响是一个值得探讨的话题。酒精度数作为白酒的一个重要参数&#xff0c;不仅决定了酒体的基本风格&#xff0c;更在很大程度上影响了白酒在贮存过程中的变化和老熟过程。 首先&#xff0c;酒精度数的…

华为配置智能无损网络综合

配置智能无损网络综合示例 适用产品和版本 安装了P系列单板的CE16800、CE6866、CE6866K、CE8851-32CQ8DQ-P、CE8851K系列交换机V300R020C00或更高版本。 安装了SAN系列单板的CE16800、CE6860-SAN、CE8850-SAN系列交换机V300R020C10或更高版本。 CE6860-HAM、CE8850-HAM系列交换…

HR人才测评:应变能力与岗位胜任力素质测评

什么是应变能力 应变能力在职场中可以说是必备的素质之一&#xff0c;它指的是从业者需要长期活动或者是行为来迎接即将到来的挑战&#xff0c;做提前的思考&#xff0c;以适应未来的挑战&#xff0c;具有随机应变的意思。在外界还未发生变化或者是已经发生变化时&#xff0c;…

python(环境安装)搭建、pycharm安装、背景改为白色详细文章

安装python环境 1、下载python安装包 Welcome to Python.org&#xff08;官网链接&#xff09; 2、点击下载、windows、python3.12.3 安装python 执行安装程序、安装选项 选择下面两项 翻译 Use admin privieges when installing py.exe是使用administrator超级管理员用户安…

MySQL从入门到高级 --- 6.函数

文章目录 第六章&#xff1a;6.函数6.1 聚合函数6.2 数学函数6.3 字符串函数6.4 日期函数6.4.1 日期格式 6.5 控制流函数6.5.1 if逻辑判断语句6.5.2 case when语句 6.6 窗口函数6.6.1 序号函数6.6.2 开窗聚合函数6.6.3 分布函数6.6.4 前后函数6.6.5 头尾函数6.6.6 其他函数6.7 …

core.sshd.xxxxxx文件过大

背景 【紧急】【应用分组】应用: 接入点服务, 分组: 观众预发, ip: xx.xx.xx.xx 【/】&#xff0c;磁盘使用率已连续2次大于90% [当前值:100%]。报警时间: 2024-05-13 14:07:01 原因 登录机器查看&#xff0c;发现根目录下有大量的崩溃文件将 / 打满 处理 1&#xff0c; 删…

SSL证书助力工业和信息化领域数据安全,确保传输数据的保密性、完整性

工业和信息化领域数据包括工业数据、电信数据和无线电数据等&#xff0c;是国家重要基础性战略资源&#xff0c;随着工业领域数字化、网络化、智能化加速提质升级&#xff0c;数据泄露、勒索攻击等网络风险日益增加&#xff0c;由此加强工业和信息化领域数据安全管理&#xff0…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.1,2,3-GPIO中断控制实验

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

山姆·奥特曼接受All-in Podcast采访

前言 在“All-in Podcast”播客中&#xff0c;OpenAI的CEO山姆奥特曼广泛讨论了人工智能的多个关键议题。他涉及了推理计算、开源模型的发展、GPT-5语言模型的进展&#xff0c;并对AI监管、全民基本收入&#xff08;UBI&#xff09;政策、智能体如何改变应用交互&#xff0c;以…

Springboot自动装配源码分析

版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --> </par…

GPT搜索鸽了!改升级GPT-4

最近OpenAI太反常&#xff0c;消息一会一变&#xff0c;直让人摸不着头脑。 奥特曼最新宣布&#xff1a;5月13日开发布会&#xff0c;不是GPT-5&#xff0c;也不是盛传的GPT搜索引擎&#xff0c;改成对ChatGP和GPT-4的升级&#xff5e; 消息一出&#xff0c;大伙儿都蒙了。 之…

【cocos creator】2.4.0 import android.support.v4.app.ActivityCompat;失败的解决方案

时间是2024年5月&#xff0c;某cocos creator项目用的是2.4.0编辑器。需求是获取录音权限&#xff0c;需要import ActivityCompat。但是失败&#xff0c;提示Cannot resolve symbol app。 尝试了一些方案失败之后&#xff0c;决定升级cocos creator编辑器版本。升级到2.4.10。…

Maven:继承和聚合

Maven高级 分模块设计和开发 如果在我们自己的项目中全部功能在同一个项目中开发,在其他项目中想要使用我们封装的组件和工具类并不方便 不方便项目的维护和管理 项目中的通用组件难以复用 所以我们需要使用分模块设计 分模块设计 在项目设计阶段,可以将大的项目拆分成若…

【快捷上手】UnrealEngine 的 关卡流 LevelStreaming 的三种加载方式

关键词&#xff1a; Unreal Engine&#xff0c;UE&#xff0c; LevelStreaming&#xff0c;动态&#xff0c;关卡&#xff0c;加载&#xff0c;切换关卡&#xff0c;换地图&#xff0c;子地图&#xff0c;子场景&#xff0c;子关卡&#xff0c;分包加载&#xff0c;动态载入 …

IT服务台的演变趋势

在技术进步和用户期望变化的推动下&#xff0c;IT服务台正在经历重大变化。IT服务台的未来将主要受到以下趋势的推动&#xff1a; 先进的人工智能和认知技术 预计高级人工智能 &#xff08;AI&#xff09; 和认知技术在 IT 服务台中的集成度会更高。通过将 IT 服务台集成到 IT…

点是否在三角形内C++源码实现

原理 思路&#xff1a; 面积和&#xff1a; abc obcaocabo,应该有更简洁的方法&#xff0c;但是这个方法思路更简单 代码实现: 注意二维向量的叉乘后&#xff0c;是垂直于平面的向量&#xff0c;相当于z为0三维向量叉乘&#xff0c;所以只有z维度有值&#xff0c;xy0. flo…

BMS-HiL系统方案设计

系统集成了业内著名 NI 公司的软硬件平台。 系统设计采用分布式设计模式。主控上位机作为整个实验的管理者主要设计软件交互和 流程管理的业务&#xff1b;下位机主要业务为序列执行与设备调用&#xff0c;各模块详细测试方案如下所示。 系统搭建使用 PXI 系统技术&#xff0c;…