Loading docs/ds/virtual-tree.md +1 −1 Original line number Diff line number Diff line Loading @@ -63,7 +63,7 @@ 首先我们称某次询问中被选中的点为——**「关键点」**。 设 $Dp[i]$ 表示——使 $i$ 不与其子树中任意一个关键点联通的**最小代价**。 设 $Dp[i]$ 表示——使 $i$ 不与其子树中任意一个关键点连通的**最小代价**。 设 $w[a,b]$ 表示 $a$ 与 $b$ 之间的边的权值。 Loading docs/graph/basic.md +6 −6 Original line number Diff line number Diff line Loading @@ -78,13 +78,13 @@ cycle,也称为 `环` ,是起点和终点相同的路径。 有向图 $G$ 弱连通是指, $G$ 中的所有边替换为无向边后, $G$ 为连通图。 ### 点联通度 ### 点连通度 一张图的点联通度的大小等于最小点割集的大小。 一张图的点连通度的大小等于最小点割集的大小。 ### 边联通度 ### 边连通度 一张图的边联通度的大小等于最小边割集的大小。 一张图的边连通度的大小等于最小边割集的大小。 ### 子图 Loading Loading @@ -152,7 +152,7 @@ cycle,也称为 `环` ,是起点和终点相同的路径。 如果给定一个序列 a,可以找到一个简单图 G,以其为度数列,则称 a 是可简单图化的。 #### 判断 #### 判别法 $a=(a_1, a_2, \cdots, a_n)$ 可图化当且仅当 $\sum_{i=1}^n{d_i} = 0 \pmod 2$ Loading @@ -160,5 +160,5 @@ $a=(a_1, a_2, \cdots, a_n)$ 可简单图化当且仅当 $a'=(a_2 - 1, a_3 - 1, \ ### Whitney 定理 对任意的图 $G$,有 $\kappa \leq \lambda \leq \delta$。其中 $\kappa, \lambda, \delta$ 分别为 $G$ 的点联通度,边联通度和最小度。 对任意的图 $G$,有 $\kappa \leq \lambda \leq \delta$。其中 $\kappa, \lambda, \delta$ 分别为 $G$ 的点连通度,边连通度和最小度。 docs/graph/bcc.md +13 −13 Original line number Diff line number Diff line Loading @@ -6,23 +6,23 @@ ## 定义 在一张联通的无向图中,如果将一条边删去后,原图变成不联通的两部分,我们就说这条边是**桥**。 在一张连通的无向图中,如果将一条边删去后,原图变成不连通的两部分,我们就说这条边是**桥**。 在一张联通的无向图中,如果将一个点删去后,原图变成不联通的两部分,我们就说这个点是**割点**。 在一张连通的无向图中,如果将一个点删去后,原图变成不连通的两部分,我们就说这个点是**割点**。 在一张联通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪条边(只能删去一条)都不能使它们不联通,我们就说 $u$ 和 $v$ **边双联通**。 在一张连通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪条边(只能删去一条)都不能使它们不连通,我们就说 $u$ 和 $v$ **边双连通**。 在一张联通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪个点(只能删去一个,且不能删 $u$ 和 $v$ 自己)都不能使它们不联通,我们就说 $u$ 和 $v$ **点双联通**。 在一张连通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪个点(只能删去一个,且不能删 $u$ 和 $v$ 自己)都不能使它们不连通,我们就说 $u$ 和 $v$ **点双连通**。 边双联通具有传递性,即,若 $x,y$ 边双联通, $y,z$ 边双联通,则 $x,z$ 边双联通。 边双连通具有传递性,即,若 $x,y$ 边双连通, $y,z$ 边双连通,则 $x,z$ 边双连通。 点双联通**不**具有传递性,反例如下图, $A,B$ 点双联通, $B,C$ 点双联通,而 $A,C$ **不**点双联通。 点双连通**不**具有传递性,反例如下图, $A,B$ 点双连通, $B,C$ 点双连通,而 $A,C$ **不**点双连通。  ## DFS 对于一张联通的无向图,我们可以从任意一点开始 DFS,得到原图的一棵生成树(以开始 DFS 的那个点为根),这棵生成树上的边称作**树边**,不在生成树上的边称作**非树边**。 对于一张连通的无向图,我们可以从任意一点开始 DFS,得到原图的一棵生成树(以开始 DFS 的那个点为根),这棵生成树上的边称作**树边**,不在生成树上的边称作**非树边**。 由于 DFS 的性质,我们可以保证所有非树边连接的两个点在生成树上都满足其中一个是另一个的祖先。 Loading @@ -36,7 +36,7 @@ void DFS(int p) { } ``` ## DFS 找桥并判断边双联通 ## DFS 找桥并判断边双连通 首先,对原图进行 DFS。 Loading @@ -50,16 +50,16 @@ void DFS(int p) { 怎么优化呢?可以用差分。对于每一条非树边,在其树上深度较小的点处打上 `-1` 标记,在其树上深度较大的点处打上 `+1` 标记。然后 $O(n)$ 求出每个点的子树内部的标记之和。对于一个点 $u$ ,其子树内部的标记之和等于覆盖了 $u$ 和 $u$ 的父亲之间的树边的非树边数量。若这个值非 $0$ ,则 $u$ 和 $u$ 的父亲之间的树边不是桥,否则是桥。 用以上的方法 $O(n+m)$ 求出每条边分别是否是桥后,两个点是边双联通的,当且仅当它们的树上路径中**不**包含桥。 用以上的方法 $O(n+m)$ 求出每条边分别是否是桥后,两个点是边双连通的,当且仅当它们的树上路径中**不**包含桥。 ## DFS 找割点并判断点双联通 ## DFS 找割点并判断点双连通  如上图所示,黑色边为树边,红色边为非树边。每一条非树边连接的两个点都对应了树上的一条简单路径。 考虑一张新图,新图中的每一个点对应原图中的每一条树边(在上图中用蓝色点表示)。对于原图中的每一条非树边,将这条非树边对应的树上简单路径中的所有边在新图中对应的蓝点连成一个联通块(这在上图中也用蓝色的边体现出来了)。 考虑一张新图,新图中的每一个点对应原图中的每一条树边(在上图中用蓝色点表示)。对于原图中的每一条非树边,将这条非树边对应的树上简单路径中的所有边在新图中对应的蓝点连成一个连通块(这在上图中也用蓝色的边体现出来了)。 这样,一个点不是桥,当且仅当与其相连的所有边在新图中对应的蓝点都属于同一个联通块。两个点点双联通,当且仅当它们在原图的树上路径中的所有边在新图中对应的蓝点都属于同一个联通块。 这样,一个点不是桥,当且仅当与其相连的所有边在新图中对应的蓝点都属于同一个连通块。两个点点双连通,当且仅当它们在原图的树上路径中的所有边在新图中对应的蓝点都属于同一个连通块。 蓝点间的连通关系可以用与求边双联通时用到的差分类似的方法维护,时间复杂度 $O(n+m)$ 。 蓝点间的连通关系可以用与求边双连通时用到的差分类似的方法维护,时间复杂度 $O(n+m)$ 。 docs/graph/bridge.md +5 −5 Original line number Diff line number Diff line 相关阅读:[双联通分量](/graph/bcc/) 相关阅读:[双连通分量](/graph/bcc/) ## 割点 > 如果在一个图中,如果把一个点删除,那么这个图不再联通,那么这个点就是割点(割顶),当然是在无向图。 > 如果在一个图中,如果把一个点删除,那么这个图不再连通,那么这个点就是割点(割顶),当然是在无向图。 ### 如何实现? 如果我们尝试删除每个点,并且判断这个图的联通性,那么复杂度会特别的高。所以要介绍一个常用的算法: $Tarjan$ 。 如果我们尝试删除每个点,并且判断这个图的连通性,那么复杂度会特别的高。所以要介绍一个常用的算法: $Tarjan$ 。 首先,我们上一个图: Loading Loading @@ -98,7 +98,7 @@ int main() { edge[x].push_back(y); edge[y].push_back(x); } // 使用 vector 存图 for (int i = 1; i <= n; i++) // 因为 Tarjan 图不一定联通 for (int i = 1; i <= n; i++) // 因为 Tarjan 图不一定连通 if (!vis[i]) { inde = 0; // 时间戳初始为 0 Tarjan(i, i); // 从第 i 个点开始,父亲为自己 Loading @@ -115,7 +115,7 @@ int main() { 和割点差不多,还叫做割桥。 > 无向联通图中,去掉一条边,图中的连通分量数增加,则这条边,称为桥或者割边,当然也是在无向图。 > 无向连通图中,去掉一条边,图中的连通分量数增加,则这条边,称为桥或者割边,当然也是在无向图。 ### 实现 Loading docs/graph/differential-constraints.md +1 −1 Original line number Diff line number Diff line Loading @@ -87,7 +87,7 @@ int main() { ## Bellman-Ford 判负环代码实现 下面是用 Bellman-Ford 算法判断图中是否存在负环的代码实现,请在调用前先保证图是联通的。 下面是用 Bellman-Ford 算法判断图中是否存在负环的代码实现,请在调用前先保证图是连通的。 ```cpp bool Bellman_Ford() { Loading Loading
docs/ds/virtual-tree.md +1 −1 Original line number Diff line number Diff line Loading @@ -63,7 +63,7 @@ 首先我们称某次询问中被选中的点为——**「关键点」**。 设 $Dp[i]$ 表示——使 $i$ 不与其子树中任意一个关键点联通的**最小代价**。 设 $Dp[i]$ 表示——使 $i$ 不与其子树中任意一个关键点连通的**最小代价**。 设 $w[a,b]$ 表示 $a$ 与 $b$ 之间的边的权值。 Loading
docs/graph/basic.md +6 −6 Original line number Diff line number Diff line Loading @@ -78,13 +78,13 @@ cycle,也称为 `环` ,是起点和终点相同的路径。 有向图 $G$ 弱连通是指, $G$ 中的所有边替换为无向边后, $G$ 为连通图。 ### 点联通度 ### 点连通度 一张图的点联通度的大小等于最小点割集的大小。 一张图的点连通度的大小等于最小点割集的大小。 ### 边联通度 ### 边连通度 一张图的边联通度的大小等于最小边割集的大小。 一张图的边连通度的大小等于最小边割集的大小。 ### 子图 Loading Loading @@ -152,7 +152,7 @@ cycle,也称为 `环` ,是起点和终点相同的路径。 如果给定一个序列 a,可以找到一个简单图 G,以其为度数列,则称 a 是可简单图化的。 #### 判断 #### 判别法 $a=(a_1, a_2, \cdots, a_n)$ 可图化当且仅当 $\sum_{i=1}^n{d_i} = 0 \pmod 2$ Loading @@ -160,5 +160,5 @@ $a=(a_1, a_2, \cdots, a_n)$ 可简单图化当且仅当 $a'=(a_2 - 1, a_3 - 1, \ ### Whitney 定理 对任意的图 $G$,有 $\kappa \leq \lambda \leq \delta$。其中 $\kappa, \lambda, \delta$ 分别为 $G$ 的点联通度,边联通度和最小度。 对任意的图 $G$,有 $\kappa \leq \lambda \leq \delta$。其中 $\kappa, \lambda, \delta$ 分别为 $G$ 的点连通度,边连通度和最小度。
docs/graph/bcc.md +13 −13 Original line number Diff line number Diff line Loading @@ -6,23 +6,23 @@ ## 定义 在一张联通的无向图中,如果将一条边删去后,原图变成不联通的两部分,我们就说这条边是**桥**。 在一张连通的无向图中,如果将一条边删去后,原图变成不连通的两部分,我们就说这条边是**桥**。 在一张联通的无向图中,如果将一个点删去后,原图变成不联通的两部分,我们就说这个点是**割点**。 在一张连通的无向图中,如果将一个点删去后,原图变成不连通的两部分,我们就说这个点是**割点**。 在一张联通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪条边(只能删去一条)都不能使它们不联通,我们就说 $u$ 和 $v$ **边双联通**。 在一张连通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪条边(只能删去一条)都不能使它们不连通,我们就说 $u$ 和 $v$ **边双连通**。 在一张联通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪个点(只能删去一个,且不能删 $u$ 和 $v$ 自己)都不能使它们不联通,我们就说 $u$ 和 $v$ **点双联通**。 在一张连通的无向图中,对于两个点 $u$ 和 $v$ ,如果无论删去哪个点(只能删去一个,且不能删 $u$ 和 $v$ 自己)都不能使它们不连通,我们就说 $u$ 和 $v$ **点双连通**。 边双联通具有传递性,即,若 $x,y$ 边双联通, $y,z$ 边双联通,则 $x,z$ 边双联通。 边双连通具有传递性,即,若 $x,y$ 边双连通, $y,z$ 边双连通,则 $x,z$ 边双连通。 点双联通**不**具有传递性,反例如下图, $A,B$ 点双联通, $B,C$ 点双联通,而 $A,C$ **不**点双联通。 点双连通**不**具有传递性,反例如下图, $A,B$ 点双连通, $B,C$ 点双连通,而 $A,C$ **不**点双连通。  ## DFS 对于一张联通的无向图,我们可以从任意一点开始 DFS,得到原图的一棵生成树(以开始 DFS 的那个点为根),这棵生成树上的边称作**树边**,不在生成树上的边称作**非树边**。 对于一张连通的无向图,我们可以从任意一点开始 DFS,得到原图的一棵生成树(以开始 DFS 的那个点为根),这棵生成树上的边称作**树边**,不在生成树上的边称作**非树边**。 由于 DFS 的性质,我们可以保证所有非树边连接的两个点在生成树上都满足其中一个是另一个的祖先。 Loading @@ -36,7 +36,7 @@ void DFS(int p) { } ``` ## DFS 找桥并判断边双联通 ## DFS 找桥并判断边双连通 首先,对原图进行 DFS。 Loading @@ -50,16 +50,16 @@ void DFS(int p) { 怎么优化呢?可以用差分。对于每一条非树边,在其树上深度较小的点处打上 `-1` 标记,在其树上深度较大的点处打上 `+1` 标记。然后 $O(n)$ 求出每个点的子树内部的标记之和。对于一个点 $u$ ,其子树内部的标记之和等于覆盖了 $u$ 和 $u$ 的父亲之间的树边的非树边数量。若这个值非 $0$ ,则 $u$ 和 $u$ 的父亲之间的树边不是桥,否则是桥。 用以上的方法 $O(n+m)$ 求出每条边分别是否是桥后,两个点是边双联通的,当且仅当它们的树上路径中**不**包含桥。 用以上的方法 $O(n+m)$ 求出每条边分别是否是桥后,两个点是边双连通的,当且仅当它们的树上路径中**不**包含桥。 ## DFS 找割点并判断点双联通 ## DFS 找割点并判断点双连通  如上图所示,黑色边为树边,红色边为非树边。每一条非树边连接的两个点都对应了树上的一条简单路径。 考虑一张新图,新图中的每一个点对应原图中的每一条树边(在上图中用蓝色点表示)。对于原图中的每一条非树边,将这条非树边对应的树上简单路径中的所有边在新图中对应的蓝点连成一个联通块(这在上图中也用蓝色的边体现出来了)。 考虑一张新图,新图中的每一个点对应原图中的每一条树边(在上图中用蓝色点表示)。对于原图中的每一条非树边,将这条非树边对应的树上简单路径中的所有边在新图中对应的蓝点连成一个连通块(这在上图中也用蓝色的边体现出来了)。 这样,一个点不是桥,当且仅当与其相连的所有边在新图中对应的蓝点都属于同一个联通块。两个点点双联通,当且仅当它们在原图的树上路径中的所有边在新图中对应的蓝点都属于同一个联通块。 这样,一个点不是桥,当且仅当与其相连的所有边在新图中对应的蓝点都属于同一个连通块。两个点点双连通,当且仅当它们在原图的树上路径中的所有边在新图中对应的蓝点都属于同一个连通块。 蓝点间的连通关系可以用与求边双联通时用到的差分类似的方法维护,时间复杂度 $O(n+m)$ 。 蓝点间的连通关系可以用与求边双连通时用到的差分类似的方法维护,时间复杂度 $O(n+m)$ 。
docs/graph/bridge.md +5 −5 Original line number Diff line number Diff line 相关阅读:[双联通分量](/graph/bcc/) 相关阅读:[双连通分量](/graph/bcc/) ## 割点 > 如果在一个图中,如果把一个点删除,那么这个图不再联通,那么这个点就是割点(割顶),当然是在无向图。 > 如果在一个图中,如果把一个点删除,那么这个图不再连通,那么这个点就是割点(割顶),当然是在无向图。 ### 如何实现? 如果我们尝试删除每个点,并且判断这个图的联通性,那么复杂度会特别的高。所以要介绍一个常用的算法: $Tarjan$ 。 如果我们尝试删除每个点,并且判断这个图的连通性,那么复杂度会特别的高。所以要介绍一个常用的算法: $Tarjan$ 。 首先,我们上一个图: Loading Loading @@ -98,7 +98,7 @@ int main() { edge[x].push_back(y); edge[y].push_back(x); } // 使用 vector 存图 for (int i = 1; i <= n; i++) // 因为 Tarjan 图不一定联通 for (int i = 1; i <= n; i++) // 因为 Tarjan 图不一定连通 if (!vis[i]) { inde = 0; // 时间戳初始为 0 Tarjan(i, i); // 从第 i 个点开始,父亲为自己 Loading @@ -115,7 +115,7 @@ int main() { 和割点差不多,还叫做割桥。 > 无向联通图中,去掉一条边,图中的连通分量数增加,则这条边,称为桥或者割边,当然也是在无向图。 > 无向连通图中,去掉一条边,图中的连通分量数增加,则这条边,称为桥或者割边,当然也是在无向图。 ### 实现 Loading
docs/graph/differential-constraints.md +1 −1 Original line number Diff line number Diff line Loading @@ -87,7 +87,7 @@ int main() { ## Bellman-Ford 判负环代码实现 下面是用 Bellman-Ford 算法判断图中是否存在负环的代码实现,请在调用前先保证图是联通的。 下面是用 Bellman-Ford 算法判断图中是否存在负环的代码实现,请在调用前先保证图是连通的。 ```cpp bool Bellman_Ford() { Loading