持续更新中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:采用“调整法”的思想,从一个点出发,调整过去。