
图论学习笔记
文章平均质量分 85
峰不二子的小迷弟
有志者,事竟成
展开
-
图论学习笔记 - Tarjan 算法与有向图连通性
前言前言给定有向图 G = (V, E),若存在 r ∈ V,满足从 r 出发能够到达 V 中所有的点,则称 G 是一个“流图”(Flow Graph),记为(G, r),其中 r 称为流图的源点。与无向图的深度优先遍历类似,我们也可以定义“流图”的搜索树和时间戳的概念:在一个流图(G, r) 上从 r 出发进行深度优先遍历,每个点只访问一次。所有发生递归的边 (x, y)(换言之,从 x 到 y 是对 y 的第一次访问)构成一棵以 r 为根的树,我们把它称为流图 (G, r) 的搜索树。原创 2022-10-24 18:14:01 · 1020 阅读 · 0 评论 -
图论学习笔记 - 树链剖分
树剖树链剖分就是对一棵树分成几条链,把树形变为线性,减少处理难度。变为线性后,经常跟线段树的知识相连,所以代码量相对比较大树剖可以维护的操作将树从x到y结点最短路径上所有节点的值都加上z求树从x到y结点最短路径上所以节点的值之和将以x为根节点的子树内所有节点值都加上z求以x为根节点的子树内所有节点值之和树剖中的关键词重儿子:对于每一个非叶子节点,它的儿子中以 那个儿子为根的子树节点数最大的儿子 为该节点的重儿子(也就是选子孙兴旺的)轻儿子:对于每一个非叶子节点,它的儿子中 非重儿子.原创 2022-08-18 15:25:51 · 452 阅读 · 0 评论 -
图论学习笔记 - 二分图的匹配
二分图原创 2022-08-11 23:50:07 · 888 阅读 · 0 评论 -
图论学习笔记 - 最近公共祖先(LCA)
LCA最近公共祖先给定一棵有根树,若节点 z 既是节点 x 的祖先,也是节点 y 的祖先,则称 z 是 x,y 的公共祖先。在 x,y 的所有公共祖先中,深度最大的一个称为 x,y 的最近公共祖先,记为 LCA(x,y)。LCA(x,y) 是 x 到根的路径与 y 到根的路径的交会点。它也是 x 与 y 之间的路径上深度最小的节点。求最近公共祖先的方法通常有四种:...原创 2022-08-09 23:40:19 · 291 阅读 · 0 评论 -
图论学习笔记 - 分层图最短路问题(以飞行路线为例)
定义分层图最短路是指在可以进行分层图的图上解决最短路问题。分层图:可以理解为有多个平行的图。一般模型是:在一个正常的图上可以进行 k 次决策,对于每次决策,不影响图的结构,只影响目前的状态或代价。一般将决策前的状态和决策后的状态之间连接一条权值为决策代价的边,表示付出该代价后就可以转换状态了。简单说就是:在图上,有 k 次机会可以直接通过一条边,问起点与终点之间的最短路径。有两种方法解决分层图最短路问题:1、建图时直接建成 k+1 层2、多开一维记录机会信息具体选哪种依题目数据原创 2022-05-03 16:57:10 · 1384 阅读 · 0 评论 -
图论学习笔记 - 关于树上环的那些事儿
基环树众所周知,N 个点的树有 N-1 条边。若在树上任意添加一条边,则会形成一个环。除了环之外,其余部分由若干棵子树构成。我们把这种 N 个点 N 条边的连通无向图,即在树上加一条边构成的恰好包含一个环的图,称为“基环树”。如果不保证连通,那么 N 个点 N 条边的无向图也可能是若干棵基环树组成的森林,简称为“基环树森林”。在有向图中,我们也有类似的概念。N 个点、N 条边、每个节点有且只有一条入边的有向图就好像以“基环”为中心,有向外扩散的趋势,故称为“外向树”。N个点、N条边、每个节点有且原创 2022-04-27 20:41:06 · 2156 阅读 · 0 评论 -
图论学习笔记 - 树的直径
前言给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为两点的路径上的边权之和。树中最远的两个节点之间的距离被称为树的直径,连接这两点的路径被称为树的最长链。后者也可称为直径,即直径既是一个数值概念,也可以代指一条路径。我们一般有两种方法求树的直径,时间复杂度都是 O(N)。树形DP求树的直径设 1 号节点为根,“N 个点 N-1 条边的无向图”就可以看作“有根树”。设 D[x] 表示从节点 x 出发走向以 x 为根的子树,能够到达的最远节点的距离。设 x 的子节点为 y1,原创 2021-12-11 14:43:28 · 969 阅读 · 0 评论 -
图论学习笔记 - 最小生成树
前言给定一张边带权的无向图 G=(V,E) 由 V 中全部 n 个顶点和 E 中 n-1 条边构成的无向联通子图被称为 G 的一颗生成树。边的权值之和最小的生成树被称为无向图 G 的最小生成树。所以任意一颗最小生成树一定包含无向图中权值最小的边。Kruskal 算法Kruskal 算法总是维护无向图的最小生成森林。最初生成森林由零条边构成,每个节点各自构成一颗仅包含一个点的树。在任意时刻,Kruskal 算法从剩余的边中选出一条权值最小的,并且这条边的两个端点属于生成森林中两棵不同的树(不连原创 2021-12-11 13:44:23 · 995 阅读 · 0 评论 -
图论学习笔记 - 最短路问题
前言·对于一张有向图,我们一般有邻接表和邻接矩阵这两种存储方式。对于无向图,可以把无向边看作两条方向相反的方向,从而采取与有向图一样的存储方式。因此,在讨论最短路问题时,我们都以有向图为例。邻接矩阵设有向图 M=(A,B),A 是点集,B 是边集,(x,y) 表示一条从 x 到 y 的有向边,其边权(或称长度)为 w(x,y)。则有邻接矩阵 Z(n*n)Z[i,j] = 0i = jZ[i,j] = w(i,j) (i,j)∈BZ[i,j] = +∞...原创 2021-12-09 11:57:28 · 788 阅读 · 0 评论 -
图论学习笔记 - 链表与邻接表
链表1. 前言C/C++自带的数据结构-数组很好用,但是无法在任意位置插入或删除元素,所以我们就需要另外一种数据结构来实现这种操作,于是链表就诞生了,链表支持在任意位置插入或删除,但只能按顺序依次访问其中的元素。我们可以用一个 struct 表示链表的节点,其中可以储存任意数据,然后我们可以用 prev 和 next 两个指针指向前后两个节点,构成一个常见的双向链表结构。此外为了防止左右两端或者空链表中访问越界,我们通常建立额外的两个节点 head 和 tail 代表链表的头尾。2. 代码实现原创 2021-12-03 23:26:28 · 1016 阅读 · 1 评论