ACM模板 | 学习笔记 树相关

持续更新中qwq 咕咕咕
此次update是在我原先自己的博客园博客的基础上进行更新的(隔了两年该忘的不该忘的都忘完了qwq),顺便整理一下我的acm模板QAQ
(我保证2021.3.1开学之前搞完!)

欢迎留言进行监工~(bushi)


1 最小生成树

  • 切割性质 假定所有边权均不相同。设S为既非空集也非全集的V的子集,边e是满足一个端点在S内,另一个端点不再S内的所有边中权值权值最小的一个,则图G的所有生成树均包含e。
  • 回路性质。假定所有边权均不相同。设C为图G的任意回路,边e是C上权值最大的边,则图G的所有生成树均不包含e。

1.1 增量最小生成树

从包含的n个点的空图开始,依次加入m条带权边。每加入一条边,输出当前图中最小生成树权值(如果当前图不联通,输出无解)。
如果加入一条边(u,v)后,图中恰好包含一个环,根据回路性质,删除该葫芦上权值最大的边即可,因此只需要在加边之前的MST中找到u到v唯一路径上权值最大的边,再和e比较,删除权值较大的一条。由于路径唯一,可以用DFS或者BFS找到这条u到v的路径,总时间复杂度为 O ( n m ) O(nm) O(nm)


1.2 最小瓶颈生成树

给出加权无向图,求一个最小生成树,使得最大边权值尽量小。
每颗最小生成树一定是最小瓶颈生成树,每颗最小瓶颈生成树却不一定是最小生成树


1.3 最小瓶颈路

给定加权无向图的两个结点u和v,求出从u到v的一条路径,使得路径上的最长边尽量短。
我们直接求出这个图的最小生成树,则起点和终点在书上的唯一路径就是我们要找的路径,这条路经上的最长边就是问题的答案。


1.3.1 每对结点间的最小瓶颈路

给出加权无向图,求每两个结点u和v之间的最小瓶颈路的最大边长 f ( u , v ) f(u,v) f(u,v)
我们先求出来最小生成树,同时计算 f ( u , v ) f(u,v) f(u,v),每访问一个结点u时,考虑所有已经访问过的老结点x,更新 f ( x , u ) = m a x ( f ( x , v ) , w ( u , v ) ) f(x,u)=max(f(x,v),w(u,v)) f(x,u)=max(f(x,v),w(u,v)),其中v是u的父亲结点。(使用dfs实现上述过程)


2 求树的重心


2.1 概念

树上一点,满足删除该点时,树内剩下的子树最大节点数最小。


2.2 性质

  • 树的重心每棵子树的大小一定小于等于 n / 2 n/2 n/2
  • 每颗子树的大小都小于等于 n / 2 n/2 n/2的点一定是这棵树的重心
  • 树中所有点到某个点的距离和中,到重心的距离和最小(如果有两个重心,他们的距离一样)
  • 两棵树通过一条边相连成为一颗新的树,新树重心一定在原来两棵树的重心的路径上。(注意中心不止一个的情况)

计算方法

  • 方法1:处理出每个节点的𝑠𝑖𝑧𝑒,依次枚举点,模拟删除该点后各子树大小,更新最优解。
  • 方法2:采用“调整法”的思想,从一个点出发,调整过去。

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值