其他分享
首页 > 其他分享> > 口胡图论

口胡图论

作者:互联网

前言

本文大多是口胡,可能有误。

大多数都是参考 oi-wiki

还有一些其他巨巨的博客。

还有 二分图最大权匹配,一般图匹配,一般图最大匹配... 没学, 懒得学了,不常考(flag)。

最短路

oi-wiki

最短路算法

差分约束

k 短路

oi-wiki k短路

口胡一下 A*:

设计评估函数 \(f(u) = g(u) + h(u)\)

其中 \(g(u)\) 是起点到 \(u\) 的最短路,\(h(u)\) 是终点到 \(u\) 的最短路(反图)。

优先队列里存 \((x, g(x))\),初始是 \((s, 0)\)。

选评估函数最优的点,向相邻点扩展。

当一个点被访问 \(k\) 次时就是 k 短路。

要指定一个点,不然一条最短路径会被多个点重复算。

时间复杂度 \(O(nk \log n)\)。

同余最短路

定义:\(n\) 个点,\(n - 1\) 条边的连通无向图(有时有向)。

遍历

树的直径

oi-wiki树的直径

树的重心

oi-wiki树的重心

树链剖分

树上启发式合并

虚树

点分治

边分治

不太懂。

点分树/动态树分治

最小生成树

  1. 排序贪心。
  1. 选最小能合并两个连通块的边。
  1. 给每个点求出属于的连通块。
  2. 对每个点求出连出其它连通块的最小边。
  3. 根据最小边将连通块合并。

最小树形图

有向图的最小生成树,要求以某个点为根能到剩下所有点

朱刘算法 \(O(nm)\)。

注意判根,判自环。

  1. 贪心,给每个点找最小入边。

  2. 找环,无环即是答案。

  3. 有环,缩点,重新标号,给连入环的边的边权去减去环内的指向当前点的边,返回第一步。

次小生成树

  1. 求解出最小生成树,尝试用没选中的边去更新选中的点, 需要维护树上路径最大值(严格次小还要维护次大值)。

瓶颈生成树

定义: 最大边权权最小的生成树。

最小生成树一定是瓶颈生成树,反过来不一定。

反证法:瓶颈生成树有一条边更小,那么就能变成更优的最小生成树。

Kruskal 重构树

最小斯坦纳树

最短路径树

树的同构

prufer序列

矩阵树定理:

参考:

oi-wiki

zhihu巨巨

%%%yyc

不允许自环

不会证明。

主要是关联矩阵 \(A\), \(B\):

无边权的树的 \(w_i = 1\),度矩阵在有边权的时候是出\入边的边权和。

矩阵 \(A\) 是 \(n \times m\) 的矩阵:

  1. 点 \(i\) 是边 \(j\) 的起点时,\(A_{i, j} = \sqrt{w_{j}}\)。
    2. 点 \(i\) 是边 \(j\) 的终点时,\(A_{i, j} = -\sqrt{w_{j}}\)。
    3. 否则为 0.

令 \(B = A^T\), \(B\) 是 \(A\) 的转置。

得到 \(L = AB\), 记 \(L\) 是Laplace矩阵。

实际上, \(L\) 就是原树的度数矩阵 - 邻接矩阵

记 \(L'\) 是 \(L\) 除去任意第 \(k\) 行第 \(k\) 列。

那么就有 \(\text{det}(L')\) 是生成树个数。

当计算 内向树 个数时,只需要改 \(B\) 的定义:

  1. 点 \(j\) 是边 \(i\) 的起点时,\(B_{i, j} = \sqrt{w_{i}}\)。
  2. 否则为 0。

这样的 Laplace 矩阵就是出度矩阵 - 邻接矩阵

但是 \(L'\) 是 \(L\) 除去根所在的行和列剩下的矩阵。

同理,计算 外向树,\(B\) 的定义相反:

  1. 点 \(j\) 是边 \(i\) 的终点时,\(B_{i, j} = -\sqrt{w_{i}}\)。
  2. 否则为 0。

得到 Laplace 矩阵就是入度矩阵 - 邻接矩阵

注 :手玩出来的减去的好像是转置的邻接矩阵,但是这样转置行列式不变。

连通性相关

割点

一个点要是割点,有两种情况:

  1. 如果是,它被割去后,子树间一定不连通,因此子树个数 \(\geq 2\) 时,就有多个连通块。

  2. 不是根 的话,它的子树能没有返祖边,那么割去这个点后,子树和父亲所在的树就相互独立了。

求桥,如果一个儿子 \(v\)没有返祖边,那么这个点到儿子这条边就是桥。

缩点 / 强连通分量

在 dfs树上,一个强连通分量是 dfs树 的连通子树

tarjan 算法可以确定每个强连通分量在 dfs树上的位置。

边双连通

点双连通

圆方树

oi-wiki

DAG有向无环图

反链与链

参考文章

前提:在 DAG 中

反链:集合中任意两点不能相互到达的集合。

  1. 因为每个反链的点都会在一条链上。

归纳证明:

  1. 一个点的图显然成立。

  2. 假设点集\(V\), 反链集 \(A\), 能到达 \(A\) 的所有点集合 \(B\), \(A\) 能到达的所有点的集合 \(C\),设入度为 0 的点是源点,出度为 0 的点是汇点。

    1. 假设 \(A\) 至少有一个点不是汇点和源点。
      有以下结论:
    • \(C \neq V, B \neq V\), 由于上面假设只要成立一个,那么 \(A\) 都全是汇点或源点。
    • \(C \cap B = A\), 反证法,如果存在一个不在 \(A\) 的点,但在 \(C, B\) 的点,要么与集合 \(A\) 的某点成环,要么某两点可以相互到达,就反链个数就变了。
    • \(C \cup B = V\), 反证法,如果存在一个点不能到 \(A\) 和 \(A\) 不能到,就多一个反链。
      - 对于 \(C\) 和 \(B\) 假设成立,并且每条 \(B\) 和 \(C\) 中的链包含\(A\) 中的某个点,一条不同链对应一个不同点。\(C\) 和 \(B\) 的链 按照 \(A\) 中的点相同就进行拼接,那么链的总数不变,反链大小也不变,假设就成立了。
    1. 如果全是汇点或源点。
    • 考虑选一个 \(A\) 中的点,找到另一个 \(V\) 中的源点或者汇点,将它们删去,得到一个子图。这个子图满足反链大小是 \(|A| - 1\), 不然就有不在汇点或者源点的反链上的点,那么假设 1 可以就证明了。
    • 根据假设,子图的最小链覆盖可以是 \(|A| - 1\), 再加上删去的那两个点的路径,就是 \(|A|\) 了,也满足假设。

    于是就有 最长反链长度 \(\geq\) 最小可相交链覆盖。

最小可相交链覆盖在下面二分图部分。

这个 DAG dp \(O(n)\) 就能求。

LGV引理

有起点集合 \(A\), 终点集合 \(B\),

令 \(e(A_i, B_j)\),是每一条 DAG 上点 \(A_i\) 到点 \(B_j\)经过的边权之积的和。

统计不相交路径,则 \(w(u, v) = 1\),边权是 1。

构造 \(|A| \times |B|\) 的矩阵 \(M\),第 \(i\) 行第 \(j\) 列的数是 \(e(A_i, B_j)\)。

那么不相交路径数即是 \(\text{det}(M) = \sum_{p} \text{sgn}(p)\prod_{i}^{|A|}e(i,p_i)\)。

其中 \(\text{sgn}(p)\) 表示有偶数个逆序对时为 \(1\), 否则为 \(-1\)。

?这里是口胡,不一定对

这里路径好像并没有顺序,所以不需要组合数和二项式反演。

通过容斥原理,不相交路径数 \(S = \sum_{i = 0}^{n}(-1)^i w\)。

复习一下超集容斥式子:

\(f(S)\) 是至少满足 \(|S|\) 个条件, \(g(T)\) 是恰好满足 \(|T|\)个条件,
此处条件是满足有 \(|S|\) 个交点。

有:

\[f(S) = \sum_{S \subseteq T}g(T) \]

反演:

\[g(S) = \sum_{S \subseteq T}(-1)^{|T| - |S|}f(T) \]

那么

\[g(\phi) = \sum_{T \subseteq U} (-1)^{|T|} f(T) \]

就是上面那个式子。

于是快乐求行列式即可。

2-sat 问题

实际上一组条件可以看成 一个强制关系

例如: \(a = 1\) 或 \(b = 1\), 如果 \(a = 0\), 那么一定的 \(b = 1\)。

对于一个点可以有 真假 两种状态,对于一组关系就连一条有向边,
求解强连通分量,存在 一组变量真假状态都在同一强连通分量说明无解。

二分图

参考:
rqy的blog
oi-wiki

二分图最大匹配

Konig 定理

最小点覆盖就是一个最小的点集使所有边的两端的点至少有一个在这个集合里。

二分图最大独立集

最小点覆盖数最大独立集互为补集,就有:

二分图最大团

团:其中任意两点都有边

最大独立集点两两不相邻,补图最大独立集在原图两点相邻。

DAG 最小不可相交路径覆盖

DAG 最小可相交路径覆盖

不可相交路径覆盖本质上是维护一条简单路径,初始时是 \((u, u)\), 通过与相邻的边匹配,最后得到不相交的路径。

可相交就代表不一定要相邻的边匹配,所以直接求出传递闭包,能到的点都可以匹配。

于是先求出传递闭包在跑最小不可相交路径覆盖。

hall定理

hall定理

网络流

参考:
oi-wiki

概念:

  1. 网络:有向图。
  2. 特殊点:源点 \(s\),汇点 \(t\)。
    3. 容量(\(c(u, v)\)):两点的边权,经过该边的流量不超过它的容量。
    4. 流量(\(f(u, v)\)):该边的流量。剩余容量:每条边剩余的容量之和。
  3. 割,去掉割集后使得流入汇点流量为0。

基本性质:

  1. 容量限制:\(f(u,v) \leq c(u, v)\)。
  2. 对称:\(f(u, v) = - f(v, u)\)。
  3. 守恒:源点流出的流量 = 流入汇点的流量。

最大流最小割定理

口胡:

  1. 最大流 \(\leq\) 最小割,因为割掉这些边的流量之和一定是0,也就是说最小割是最大流的上界。
  2. 最大流 \(=\) 最小割,如果这些边集的流量不是满的,那么一定被其它的边的容量限制,割去那些边一定不劣于割去这些流量不满的边,最后的割掉的边一定是满流的边。

平面图最小割:

转化为对偶图跑最短路。

对偶图的点是原图的边分割的不相交区域,两个相邻的区域之间有一条边,边权就是这条边的容量,跑最短路就会选择一条路径把平面分割成两个区域。

全局最小割 Stoer_Wagner

不会证明。

  1. 找出当前最小割,阶段割。

    • 维护一个集合 \(A\), 在未加入的点中找到与集合 \(A\) 中的点相连的边的边权最大的那个加入。
    • 最后两个加入的点是源点和汇点,倒数第一个是源点,倒数第二个是汇点,最小割是 \(w_t\)
  2. 将源点和汇点合并,边权合并。

最小割树

建树:

  1. 求出当前点集 \(V\) 的割集 \((S, T)\)(利用残量网络)。

  2. 向 \(s\) 到 \(t\) 连边为 最小割的边。

  3. 分治,分别将 \(S, T\) 作为 \(V\), 回到第一步。

查询:

两点最小割就是树上两点路径上的最小边权。

上下界网络流

参考:

算法学习笔记(60): 上下界网络流 zhihu

oi-wiki

无汇源上下界可行流
有汇源上下界可行流
有汇源上下界最大流
有源汇上下界最小流

网络流模型:

欧拉图:

前提:连通图。

欧拉回路路径的判断

  1. 有向图的欧拉路径,只存在一点出度比入度大1(起点),只存在一点入度比出度大 1(终点)。

  2. 有向图的欧拉回路,所有点的出度等于入度。

  3. 无向图的欧拉路径,恰好两个点的度数是奇数,剩下的都是偶数。

  4. 无向图的欧拉回路,所有点度数都是偶数。

Best 定理

\[ec(G) = t^{root}(G)\prod_{u} (\text{deg}(u) - 1)! \]

其中:\(t^{root}(G)\) 是 \(G\) 的内向生成树的个数。

标签:图论,路径,连通,源点,最小,汇点,流量
来源: https://www.cnblogs.com/qjbqjb/p/16030980.html