Loading docs/graph/chord.md +4 −3 Original line number Diff line number Diff line Loading @@ -122,9 +122,10 @@ **Lemma 9** :考虑三个点 $u,v,w$ 满足 $\alpha(u)<\alpha(v)<\alpha(w)$ ,如果 $uw$ 相连, $vw$ 不相连,则 $w$ 只给 $u$ 的 $label$ 贡献,不给 $v$ 贡献。为了让 $v$ 比 $u$ 先加入序列,需要一个 $x$ 满足 $\alpha(v)<\alpha(x)$ 且 $vx$ 相连, $ux$ 不相连,即 $x$ 只给 $v$ 贡献而不给 $u$ 贡献。 **Lemma 10** :任意一个弦图一定不存在一个序列 $v_0,v_1,...,v_k(k\ge 2)$ 满足下列性质: 1. $v_iv_j$ 相连当且仅当 $|i-j|=1$ 。 1. $\alpha(v_0)>\alpha(v_i)(i\in[1,k])$ 。 1.存在 $i\in[1,k-1]$ ,满足 $\alpha(v_i)<\alpha(v_{i+1})<...<\alpha(v_k)$ 且 $\alpha(v_i)<\alpha(v_{i-1})<...<\alpha(v_1)<\alpha(v_k)<\alpha(v_0)$ 。 2. $\alpha(v_0)>\alpha(v_i)(i\in[1,k])$ 。 3. 存在 $i\in[1,k-1]$ ,满足 $\alpha(v_i)<\alpha(v_{i+1})<...<\alpha(v_k)$ 且 $\alpha(v_i)<\alpha(v_{i-1})<...<\alpha(v_1)<\alpha(v_k)<\alpha(v_0)$ 。 证明: Loading docs/graph/flow/max-flow.md +27 −1 Original line number Diff line number Diff line Loading @@ -131,9 +131,35 @@ Dinic 算法有两个优化: 1. **多路增广** :每次找到一条增广路的时候,如果残余流量没有用完怎么办呢?我们可以利用残余部分流量,再找出一条增广路。这样就可以在一次 DFS 中找出多条增广路,大大提高了算法的效率。 2. **当前弧优化** :如果一条边已经被增广过,那么它就没有可能被增广第二次。那么,我们下一次进行增广的时候,就可以不必再走那些已经被增广过的边。 #### 时间复杂度 设点数为 $n$ ,边数为 $m$ ,那么 Dinic 算法的时间复杂度(在应用上面两个优化的前提下)是 $O(n^{2}m)$ ,在稀疏图上效率和 EK 算法相当,但在稠密图上效率要比 EK 算法高很多。 特别地,在求解二分图最大匹配问题时,可以证明 Dinic 算法的时间复杂度是 $O(m\sqrt{n})$ 。 首先考虑单轮增广的过程。在应用了 **当前弧优化** 的前提下,对于每个点,我们维护下一条可以增广的边,而当前弧最多变化 $m$ 次,从而单轮增广的最坏时间复杂度为 $O(nm)$ 。 接下来我们证明,最多只需 $n-1$ 轮增广即可得到最大流。 我们先回顾下 Dinic 的增广过程。对于每个点,Dinic 只会找比该点层数多 $1$ 的点进行增广。 首先容易发现,对于图上的每个点,一轮增广后其层数一定不会减小。而对于汇点 $t$ ,情况会特殊一些,其层数在一轮增广后一定增大。 对于后者,我们考虑用反证法证明。如果 $t$ 的层数在一轮增广后不变,则意味着在上一次增广中,仍然存在着一条从 $s$ 到 $t$ 的增广路,且该增广路上相邻两点间的层数差为 $1$ 。这条增广路应该在上一次增广过程中就被增广了,这就出现了矛盾。 从而我们证明了汇点的层数在一轮增广后一定增大,即增广过程最多进行 $n-1$ 次。 综上 Dinic 的最坏时间复杂度为 $O(n^{2}m)$ 。事实上在一般的网络上,Dinic 算法往往达不到这个上界。 特别地,在求解二分图最大匹配问题时,Dinic 算法的时间复杂度是 $O(m\sqrt{n})$ 。接下来我们将给出证明。 首先我们来简单归纳下求解二分图最大匹配问题时,建立的网络的特点。我们发现这个网络中,所有边的流量均为 $1$ ,且除了源点和汇点外的所有点,都满足入边最多只有一条,或出边最多只有一条。我们称这样的网络为 **单位网络** 。 对于单位网络,一轮增广的时间复杂度为 $O(m)$ ,因为每条边只会被考虑最多一次。 接下来我们试着求出增广轮数的上界。假设我们已经先完成了前 $\sqrt{n}$ 轮增广,因为汇点的层数在每次增广后均严格增加,因此所有长度不超过 $\sqrt{n}$ 的增广路都已经在之前的增广过程中被增广。设前 $\sqrt{n}$ 轮增广后,网络的流量为 $f$ ,而整个网络的最大流为 $f'$ ,设两者间的差值 $d=f'-f$ 。 因为网络上所有边的流量均为 $1$ ,所以我们还需要找到 $d$ 条增广路才能找到网络最大流。又因为单位网络的特点,这些增广路不会在源点和汇点以外的点相交。因此这些增广路至少经过了 $d\sqrt{n}$ 个点(每条增广路的长度至少为 $\sqrt{n}$ ),且不能超过 $n$ 个点。因此残量网络上最多还存在 $\sqrt{n}$ 条增广路。也即最多还需增广 $\sqrt{n}$ 轮。 综上,对于包含二分图最大匹配在内的单位网络,Dinic 算法可以在 $O(m\sqrt{n})$ 的时间内求出其最大流。 ??? note "参考代码" ```cpp Loading docs/math/bernoulli.md +32 −11 Original line number Diff line number Diff line Loading @@ -160,40 +160,61 @@ $$ 两边都加上 $B_{m + 1}$ ,即得到: $$ \begin{aligned} \sum_{j=0}^{m+1}\binom{m+1}{j}B_j&=[m=0]+B_{m+1}\\ \sum_{j=0}^{m}\binom{m}{j}B_j&=[m=1]+B_{m}\\ \sum_{j=0}^{m}\dfrac{B_j}{j!}\cdot\dfrac{1}{(m-j)!}&=[m=1]+\dfrac{B_{m}}{m!} \end{aligned}$$ \end{aligned} $$ 设 $B(z) = \sum\limits_{i\ge 0}\dfrac{B_i}{i!}z^i$ ,注意到左边为卷积形式,故: $$ B(z)e^z &= z+B(z)\\B(z) &=\\dfrac{z}{e^z - 1}\\end{aligned}$$ $$ \begin{aligned} B(z)e^z &= z+B(z)\\ B(z)&=\dfrac{z}{e^z - 1} \end{aligned} $$ 设 $F_n(z) = \sum_{m\ge 0}\dfrac{S_m(n)}{m!}z^m$ ,则: $$ \begin{aligned} F_n(z) &= \sum_{m\ge 0}\dfrac{S_m(n)}{m!}z^m\\ &= \sum_{m\ge 0}\sum_{i=0}^{n-1}\dfrac{i^mz^m}{m!}\\ \end{aligned}$$ \end{aligned} $$ 调换求和顺序: $$ F*n(z) &=\\sum*{i=0}^{n-1}\\sum*{m\\ge 0}\\dfrac{i^mz^m}{m!}\\&=\\sum*{i=0}^{n-1}e^{iz}\\&=\\dfrac{e^{nz} - 1}{e^z - 1}\\&=\\dfrac{z}{e^z - 1}\\cdot\\dfrac{e^{nz} - 1}{z}\\end{aligned}$$ $$ \begin{aligned} F_n(z) &=\sum_{i=0}^{n-1}\sum_{m\ge 0}\dfrac{i^mz^m}{m!}\\ &=\sum_{i=0}^{n-1}e^{iz}\\ &=\dfrac{e^{nz} - 1}{e^z - 1}\\ &=\dfrac{z}{e^z - 1}\cdot\dfrac{e^{nz} - 1}{z} \end{aligned} $$ 代入 $B(z)=\dfrac{z}{e^z - 1}$ : $$ \begin{aligned} F_n(z) &= B(z)\cdot\dfrac{e^{nz} - 1}{z}\\ &= \left(\sum_{i\ge 0}\dfrac{B_i}{i!} \right)\left(\sum_{i\ge 1}\dfrac{n^i z^{i - 1}}{i!}\right)\\ &= \left(\sum_{i\ge 0}\dfrac{B_i}{i!} \right)\left(\sum_{i\ge 0}\dfrac{n^{i+1} z^{i}}{(i+1)!}\right) \end{aligned}$$ \end{aligned} $$ 由于 $F_n(z) = \sum_{m\ge 0}\dfrac{S_m(n)}{m!}z^m$ ,即 $S_m(n)=m![z^m]F_n(z)$ : $$ S*m(n)&=m![z^m]F_n(z)\\&= m!\\sum*{i=0}^{m}\\dfrac{B*i}{i!}\\cdot\\dfrac{n^{m-i+1}}{(m-i+1)!}\\&=\\dfrac{1}{m+1}\\sum*{i=0}^{m}\\binom{m+1}{i}B_in^{m-i+1}\\end{aligned}$$ $$ \begin{aligned} S \times m(n)&=m![z^m]F_n(z)\\ &= m!\sum_{i=0}^{m}\dfrac{B \times i}{i!}\cdot\dfrac{n^{m-i+1}}{(m-i+1)!}\\ &=\dfrac{1}{m+1}\sum_{i=0}^{m}\binom{m+1}{i}B_in^{m-i+1} \end{aligned} $$ 故得证。 Loading Loading
docs/graph/chord.md +4 −3 Original line number Diff line number Diff line Loading @@ -122,9 +122,10 @@ **Lemma 9** :考虑三个点 $u,v,w$ 满足 $\alpha(u)<\alpha(v)<\alpha(w)$ ,如果 $uw$ 相连, $vw$ 不相连,则 $w$ 只给 $u$ 的 $label$ 贡献,不给 $v$ 贡献。为了让 $v$ 比 $u$ 先加入序列,需要一个 $x$ 满足 $\alpha(v)<\alpha(x)$ 且 $vx$ 相连, $ux$ 不相连,即 $x$ 只给 $v$ 贡献而不给 $u$ 贡献。 **Lemma 10** :任意一个弦图一定不存在一个序列 $v_0,v_1,...,v_k(k\ge 2)$ 满足下列性质: 1. $v_iv_j$ 相连当且仅当 $|i-j|=1$ 。 1. $\alpha(v_0)>\alpha(v_i)(i\in[1,k])$ 。 1.存在 $i\in[1,k-1]$ ,满足 $\alpha(v_i)<\alpha(v_{i+1})<...<\alpha(v_k)$ 且 $\alpha(v_i)<\alpha(v_{i-1})<...<\alpha(v_1)<\alpha(v_k)<\alpha(v_0)$ 。 2. $\alpha(v_0)>\alpha(v_i)(i\in[1,k])$ 。 3. 存在 $i\in[1,k-1]$ ,满足 $\alpha(v_i)<\alpha(v_{i+1})<...<\alpha(v_k)$ 且 $\alpha(v_i)<\alpha(v_{i-1})<...<\alpha(v_1)<\alpha(v_k)<\alpha(v_0)$ 。 证明: Loading
docs/graph/flow/max-flow.md +27 −1 Original line number Diff line number Diff line Loading @@ -131,9 +131,35 @@ Dinic 算法有两个优化: 1. **多路增广** :每次找到一条增广路的时候,如果残余流量没有用完怎么办呢?我们可以利用残余部分流量,再找出一条增广路。这样就可以在一次 DFS 中找出多条增广路,大大提高了算法的效率。 2. **当前弧优化** :如果一条边已经被增广过,那么它就没有可能被增广第二次。那么,我们下一次进行增广的时候,就可以不必再走那些已经被增广过的边。 #### 时间复杂度 设点数为 $n$ ,边数为 $m$ ,那么 Dinic 算法的时间复杂度(在应用上面两个优化的前提下)是 $O(n^{2}m)$ ,在稀疏图上效率和 EK 算法相当,但在稠密图上效率要比 EK 算法高很多。 特别地,在求解二分图最大匹配问题时,可以证明 Dinic 算法的时间复杂度是 $O(m\sqrt{n})$ 。 首先考虑单轮增广的过程。在应用了 **当前弧优化** 的前提下,对于每个点,我们维护下一条可以增广的边,而当前弧最多变化 $m$ 次,从而单轮增广的最坏时间复杂度为 $O(nm)$ 。 接下来我们证明,最多只需 $n-1$ 轮增广即可得到最大流。 我们先回顾下 Dinic 的增广过程。对于每个点,Dinic 只会找比该点层数多 $1$ 的点进行增广。 首先容易发现,对于图上的每个点,一轮增广后其层数一定不会减小。而对于汇点 $t$ ,情况会特殊一些,其层数在一轮增广后一定增大。 对于后者,我们考虑用反证法证明。如果 $t$ 的层数在一轮增广后不变,则意味着在上一次增广中,仍然存在着一条从 $s$ 到 $t$ 的增广路,且该增广路上相邻两点间的层数差为 $1$ 。这条增广路应该在上一次增广过程中就被增广了,这就出现了矛盾。 从而我们证明了汇点的层数在一轮增广后一定增大,即增广过程最多进行 $n-1$ 次。 综上 Dinic 的最坏时间复杂度为 $O(n^{2}m)$ 。事实上在一般的网络上,Dinic 算法往往达不到这个上界。 特别地,在求解二分图最大匹配问题时,Dinic 算法的时间复杂度是 $O(m\sqrt{n})$ 。接下来我们将给出证明。 首先我们来简单归纳下求解二分图最大匹配问题时,建立的网络的特点。我们发现这个网络中,所有边的流量均为 $1$ ,且除了源点和汇点外的所有点,都满足入边最多只有一条,或出边最多只有一条。我们称这样的网络为 **单位网络** 。 对于单位网络,一轮增广的时间复杂度为 $O(m)$ ,因为每条边只会被考虑最多一次。 接下来我们试着求出增广轮数的上界。假设我们已经先完成了前 $\sqrt{n}$ 轮增广,因为汇点的层数在每次增广后均严格增加,因此所有长度不超过 $\sqrt{n}$ 的增广路都已经在之前的增广过程中被增广。设前 $\sqrt{n}$ 轮增广后,网络的流量为 $f$ ,而整个网络的最大流为 $f'$ ,设两者间的差值 $d=f'-f$ 。 因为网络上所有边的流量均为 $1$ ,所以我们还需要找到 $d$ 条增广路才能找到网络最大流。又因为单位网络的特点,这些增广路不会在源点和汇点以外的点相交。因此这些增广路至少经过了 $d\sqrt{n}$ 个点(每条增广路的长度至少为 $\sqrt{n}$ ),且不能超过 $n$ 个点。因此残量网络上最多还存在 $\sqrt{n}$ 条增广路。也即最多还需增广 $\sqrt{n}$ 轮。 综上,对于包含二分图最大匹配在内的单位网络,Dinic 算法可以在 $O(m\sqrt{n})$ 的时间内求出其最大流。 ??? note "参考代码" ```cpp Loading
docs/math/bernoulli.md +32 −11 Original line number Diff line number Diff line Loading @@ -160,40 +160,61 @@ $$ 两边都加上 $B_{m + 1}$ ,即得到: $$ \begin{aligned} \sum_{j=0}^{m+1}\binom{m+1}{j}B_j&=[m=0]+B_{m+1}\\ \sum_{j=0}^{m}\binom{m}{j}B_j&=[m=1]+B_{m}\\ \sum_{j=0}^{m}\dfrac{B_j}{j!}\cdot\dfrac{1}{(m-j)!}&=[m=1]+\dfrac{B_{m}}{m!} \end{aligned}$$ \end{aligned} $$ 设 $B(z) = \sum\limits_{i\ge 0}\dfrac{B_i}{i!}z^i$ ,注意到左边为卷积形式,故: $$ B(z)e^z &= z+B(z)\\B(z) &=\\dfrac{z}{e^z - 1}\\end{aligned}$$ $$ \begin{aligned} B(z)e^z &= z+B(z)\\ B(z)&=\dfrac{z}{e^z - 1} \end{aligned} $$ 设 $F_n(z) = \sum_{m\ge 0}\dfrac{S_m(n)}{m!}z^m$ ,则: $$ \begin{aligned} F_n(z) &= \sum_{m\ge 0}\dfrac{S_m(n)}{m!}z^m\\ &= \sum_{m\ge 0}\sum_{i=0}^{n-1}\dfrac{i^mz^m}{m!}\\ \end{aligned}$$ \end{aligned} $$ 调换求和顺序: $$ F*n(z) &=\\sum*{i=0}^{n-1}\\sum*{m\\ge 0}\\dfrac{i^mz^m}{m!}\\&=\\sum*{i=0}^{n-1}e^{iz}\\&=\\dfrac{e^{nz} - 1}{e^z - 1}\\&=\\dfrac{z}{e^z - 1}\\cdot\\dfrac{e^{nz} - 1}{z}\\end{aligned}$$ $$ \begin{aligned} F_n(z) &=\sum_{i=0}^{n-1}\sum_{m\ge 0}\dfrac{i^mz^m}{m!}\\ &=\sum_{i=0}^{n-1}e^{iz}\\ &=\dfrac{e^{nz} - 1}{e^z - 1}\\ &=\dfrac{z}{e^z - 1}\cdot\dfrac{e^{nz} - 1}{z} \end{aligned} $$ 代入 $B(z)=\dfrac{z}{e^z - 1}$ : $$ \begin{aligned} F_n(z) &= B(z)\cdot\dfrac{e^{nz} - 1}{z}\\ &= \left(\sum_{i\ge 0}\dfrac{B_i}{i!} \right)\left(\sum_{i\ge 1}\dfrac{n^i z^{i - 1}}{i!}\right)\\ &= \left(\sum_{i\ge 0}\dfrac{B_i}{i!} \right)\left(\sum_{i\ge 0}\dfrac{n^{i+1} z^{i}}{(i+1)!}\right) \end{aligned}$$ \end{aligned} $$ 由于 $F_n(z) = \sum_{m\ge 0}\dfrac{S_m(n)}{m!}z^m$ ,即 $S_m(n)=m![z^m]F_n(z)$ : $$ S*m(n)&=m![z^m]F_n(z)\\&= m!\\sum*{i=0}^{m}\\dfrac{B*i}{i!}\\cdot\\dfrac{n^{m-i+1}}{(m-i+1)!}\\&=\\dfrac{1}{m+1}\\sum*{i=0}^{m}\\binom{m+1}{i}B_in^{m-i+1}\\end{aligned}$$ $$ \begin{aligned} S \times m(n)&=m![z^m]F_n(z)\\ &= m!\sum_{i=0}^{m}\dfrac{B \times i}{i!}\cdot\dfrac{n^{m-i+1}}{(m-i+1)!}\\ &=\dfrac{1}{m+1}\sum_{i=0}^{m}\binom{m+1}{i}B_in^{m-i+1} \end{aligned} $$ 故得证。 Loading