图论算法
文章平均质量分 71
图论
Se_ren_di_pity
这个作者很懒,什么都没留下…
展开
-
LCT——Link Cut Tree及其应用
我们知道,想要维护树上的一段区间,我们可以采用重链剖分来将其划分但是,树链剖分只能够维护静态(树的形态不发生变化)的树,倘若我们需要动态对树的形态进行修改,比如将某个结点换为树的根、树中边的增删、子树合并和分离操作等,并需要在线地回答相关询问,那么每一次修改后,轻重链都需要重构,效率就会大大降低所以,我们需要一种数据结构能够动态地维护树上的区间这就是今天要用到的LCTLCT是在1982年由Tarjan大佬等人提出的。原创 2024-06-30 01:06:50 · 659 阅读 · 0 评论 -
动态DP&动态树分治
这是一条子节点向父结点转移的方程,因此,我们只需要对树的根节点进行dfs,先更新子节点的值,再用其来更新父节点的值,最终就可以得到根的两个dp值,f[root][0]和f[root][1],我们只需要取两者中的较大者,就是该棵树的最大权独立集。我们可以想象一下,我们现在对结点u进行了点权修改,显然u的子树的dp值是不需要修改的,u的兄弟结点的dp值也是不需要修改的,我们需要修改的只有u节点到根结点这一整条路径上的结点的dp值。其中f[x][0]表示不选择节点x加入点集,以x为根的这棵树的最大点权和。原创 2024-06-30 22:25:36 · 1373 阅读 · 0 评论 -
差分数组与树上差分
假设我们现在需要维护一段区间,实现对一段区间[L,R]的数的加/减,以及对区间中某个数的查询最简单的方法把这段区间的数都记录到数组a[N]中,每次修改都对区间[L,R]的每一个数进行加减操作,然后在查询第k个数的时候返回a[k]在上述算法中,修改操作的复杂度是o(n),而查询操作的复杂度是o(1)这种操作在查询次数大,修改次数小的时候很高效但在修改次数大,查询次数少的时候,就显得很慢了那么在这个时候,我们可以使用差分数组来维护这段区间。原创 2024-06-26 21:06:14 · 452 阅读 · 0 评论 -
网络流最大流,费用流
网络流,指的是在一个每条边都有容量的有向图分配流,使得一条边的流量不会超过他的容量有向图称为网络,顶点称为结点,边称为弧源点:只出不进的顶点汇点:只进不出的顶点容量和流量:每条有向边上有两个两,容量和流量。原创 2024-09-08 11:21:11 · 545 阅读 · 0 评论 -
树上dp之换根dp
换根dp是树上dp的一种我们在什么时候需要用到换根dp呢?当题目询问的属性,是需要当前结点为根时的属性,这个时候,我们就要使用换根dp换根dp的基本思路:假设题目询问的的属性为x通常我们会进行两次dfs第一次dfs,我们选取任意一个结点作为给出的无根树的根,对其进行dfs,并求出这个根的x,以及一些其他辅助数组(即节点与其子树的一些属性关系)第二次dfs,我们记dp[i]为对于结点i而言,节点i作为树的根时,我们要求的属性x。原创 2024-08-13 22:46:07 · 1011 阅读 · 0 评论 -
树链剖分及其应用
1.重儿子:假设节点u有n个子结点,其中以v子节点的为根子树的大小最大,那么v就是u的重儿子。只需要让top[u]的深度较大的一方跳到其top[u]的父亲结点上,自然就到了另一条新链了。首先,我们可以很简单地通过dfs获取一个结点的dep,fa和siz,从而也就获得了siz。假设他们在同一条链上,也就是top相同,那么他们的lca就是深度比较小的一方。siz[u]:以u节点为根的子树的大小。重儿子的top就等于自己u节点的top。top[u]:u结点所在的链的顶点。4.重边:结点u与重儿子连接的边。原创 2024-06-27 00:50:07 · 435 阅读 · 0 评论 -
树上差分的公式推导
其实这两者在这个节点这里是等效的,所以我们随机减免一个就可以了,我们这里选择给dep[x]的权值减1。我们再来分析lca到y的路径上的结点j,对于这个结点j,如果x出发的人能够被他观测到,那么应该满足关系式:dep[x]-dep[lca]+dep[j]-dep[lca]=w[j],这样一来,我们就可以得到:dep[j]-w[i]=2*dep[lca]-dep[x],也就是说,对于路径上的每个这样的结点j,我们只需要计数2*dep[lca]-dep[x]的个数,就可以知道他可以观测到多少个人了。原创 2024-07-03 01:46:52 · 320 阅读 · 0 评论 -
FHQ_Treap笔记
【代码】FHQ_Treap笔记。原创 2024-06-23 16:57:55 · 256 阅读 · 0 评论 -
倍增法找lca——最近公共祖先
在这种情况下,我们只需要x和y同步往上爬,直到他们两个的祖先重合,就可以得到x与y的公共祖先了。这个时候,我们就应当先找到一个x的祖先,这个祖先和y的深度相同,然后再按照情况2处理。这和把一个十进制的数转为一个二进制的数是一样的,我们都是从最高位往最低位填1。所以想要实现这样的算法,我们需要记录各个点的深度,以及他们。2.dep[x]<dep[y]或dep[y]<dep[x]一个最简单的办法就是沿着x和y的父节点一个一个往上找。对于结点x和y,需要找他们的最近公共祖先。这个时候,x与y的lca一定是y。原创 2024-06-26 20:02:56 · 396 阅读 · 0 评论 -
图论常见算法总结——prim,kruskal,dijkstra,floyed,bellman-ford,spfa
我们对到达结点u的最短路径所经历过的结点数cnt进行统计,显然cnt[u]不会超过n,若超过了n,说明已形成环路,且一定是负环。我们先建立一层外层循环,在每一次循环中,都枚举图中的m条边,并对起点到每一个结点的最短路径进行松弛更新,可以保证,每次最少更新一条边,那么在至多n-1次循环后,在循环中将不会再有边更新。任意选取一个起点u,设已加入树的结点为V,总结点为T,则每次搜索连接V与T-V的最短边,并使之加入V(即从T-V向V中加入一个新的节点),当T中所有节点访问完成,即为最小生成树。原创 2024-06-11 11:52:14 · 1140 阅读 · 0 评论 -
tarjan算法——割点、桥,强连通分量、缩点
在一张无向连通图中,若将结点u去除后,该图不再连通,则称结点u为割点。原创 2024-06-14 17:52:31 · 996 阅读 · 0 评论 -
splay树——伸展树
【代码】splay树——伸展树。原创 2024-06-23 00:49:38 · 379 阅读 · 0 评论 -
差分约束系统
现有给出若干个形如的不等式约束,其中求是否存在一组关于到的解。原创 2024-06-14 12:14:02 · 853 阅读 · 0 评论