图论考前瞄一眼

一些总结

图的基本概念

  • 一些证明思想
    • 方体二分图的分类(奇数个1与偶数个1)
    • 二分图无奇圈(证明二分图的分类,距离到一点为偶数的集合与为奇数的集合,证明集合内部不相邻)
    • 证明图连通或两点之间连通,通常反证法
    • 找最长轨道,度数大于1,则该边另一点必在轨道上,可形成圈
  • 一些算法
    • D i j s k t r a Dijsktra Dijsktra算法:输入一点 u 0 u_0 u0,求出该点到其他顶点的最短路径
      • d ( u ) : d(u): d(u):表示最短距离, l ( u ) : l(u): l(u):表示该路径的 u u u的前继结点, S : S: S:为已被选择的顶点的集合
      • 1、初始化 d ( u 0 ) = 0 , l ( u 0 ) = u 0 , d ( u ) = ∞ , l ( u ) = ∗ d(u_0)=0,l(u_0)=u_0,d(u)=\infty,l(u)=* d(u0)=0l(u0)=u0d(u)=l(u)=,其中 u ∈ V ( G ) u\in V(G) uV(G),且 u ≠ u 0 u\neq u_0 u=u0 S = u 0 S={u_0} S=u0
      • 2、更新数据:对任给 u ∈ V ( G ) − S , v ∈ S u\in V(G)-S,v\in S uV(G)S,vS,若 d ( v ) + w ( u v ) < d ( u ) d(v)+w(uv)<d(u) d(v)+w(uv)<d(u),则令 d ( u ) = d ( v ) + w ( u v ) , l ( u ) = v d(u)=d(v)+w(uv),l(u)=v d(u)=d(v)+w(uv),l(u)=v
      • 3、加入新点:选出 u ∈ V ( G ) − S u\in V(G)-S uV(G)S,使得 d ( u ) d(u) d(u)最小的点, S = S ∪ { u } S=S\cup\{u\} S=S{u}
      • 重复 2 、 3 步 ∣ V ( G ) ∣ − 1 2、3步|V(G)|-1 23V(G)1次,结束算法

  • 一些证明思想
    • 连通图不是树必有圈
    • 生成树可被分为两类(不包含边 e e e τ ( G − e ) \tau(G-e) τ(Ge),包含边 e e e τ ( G ⋅ e ) \tau(G·e) τ(Ge))
    • n n n个结点标号,每次删号最小的叶,输出与其相邻的顶点号,并删除该边,直至剩两个顶点,可标定生成树
    • 证明最优二叉树,可任选两点交换位置,证明交换前权值比交换后权值小
  • 一些算法
    • K r u s k a l Kruskal Kruskal算法(选边)
      • 选择边权最小的边e
      • 从未选的边中选择与已选边不能构成圈的最小的边权的边,直至不能选。
    • P r i m Prim Prim算法(选边和顶点)
      • V V V为已选顶点集合, E E E为已选边集合
      • 任选一点 s s s,使 V = s V={s} V=s,选择与 s s s相连权最小的边 e e e E = e E={e} E=e
      • 选择一点在V中一点不在V中的最小权边 s t st st V = V ∪ { t } V=V\cup\{t\} V=V{t} E = E ∪ { s t } E=E\cup\{st\} E=E{st}
      • 反复执行上一步,直至 ∣ V ∣ = ∣ V ( G ) ∣ |V|=|V(G)| V=V(G)
    • 破圈法(删边):
      • 保证图G的连通性的情况下,删除边权最大的边
    • H u f f m a n Huffman Huffman算法
      • 不断选择权值最小的两个顶点,新形成的分支点权值为其和并加入选择顶点集合中,不断重复此过程,直至形成一棵树

图的连通性

  • 一些证明思想
    • 两两无公共内顶轨道的数量为最小顶割集的顶点数 p ( u , v ) = c ( u , v ) p(u,v)=c(u,v) p(u,v)=c(u,v)
    • k k k连通图加一点且让该点与任意图中 k k k个顶点连边,得到的新图仍是 k k k连通图
    • 证明 k k k连通图:取 k − 1 k-1 k1个顶点集合,证明图减去这 k − 1 k-1 k1个顶点仍连通
    • k k k连通图上任意 k k k个点都在一个圈 C C C上( k ≥ 2 k\geq 2 k2)
    • 两两无公共边的轨道最大数量为最小边割集的边数 p ′ ( u , v ) = c ′ ( u , v ) p'(u,v)=c'(u,v) p(u,v)=c(u,v)
  • 一些算法
    • 构造完全图权值为1的k-连通生成子图 H n , k H_{n,k} Hn,k方法如下(Harary提出),设 V ( H n , k ) = { 0 , 1 , 2 , ⋯   , n − 1 } V(H_{n,k})=\{0,1,2,\cdots,n-1\} V(Hn,k)={0,1,2,,n1}
      • k k k为偶,设 k = 2 r k=2r k=2r,令 0 与 1 , 2 , ⋯   , r 0与1,2,\cdots,r 01,2,,r连线, 1 与 2 , 3 , ⋯   , r + 1 1与2,3,\cdots,r+1 12,3,,r+1连线, ⋯ \cdots n − 1 与 0 , 1 , ⋯   , r − 1 n-1与0,1,\cdots,r-1 n10,1,,r1连线。
      • k = 2 r + 1 , n 为 偶 k=2r+1,n为偶 k=2r+1,n,先做 H 2 r , n H_{2r,n} H2r,n,再在 i i i ( i + n 2 ) (i+\frac{n}{2}) (i+2n)间添加边 i ( i + n 2 ) ( 1 ≤ i ≤ n 2 ) i(i+\frac{n}{2})(1\leq i\leq \frac{n}{2}) i(i+2n)(1i2n)
      • k = 2 r + 1 , n 为 奇 k=2r+1,n为奇 k=2r+1,n,先做 H 2 r , n H_{2r,n} H2r,n,再在 0 和 n − 1 2 0和\frac{n-1}{2} 02n1 0 和 n + 1 2 0和\frac{n+1}{2} 02n+1 i i i ( i + n + 1 2 ) (i+\frac{n+1}{2}) (i+2n+1)间添加边 i ( i + n 2 ) ( 1 ≤ i ≤ n − 1 2 ) i(i+\frac{n}{2})(1\leq i\leq \frac{n-1}{2}) i(i+2n)(1i2n1)

平面图

  • 一些证明思想
    • 图可嵌入平面,当且仅当图可嵌入球面(投影)
    • v − ϵ + ϕ = 2 v-\epsilon+\phi=2 vϵ+ϕ=2(数归)
    • K 5 和 K 3 , 3 K_5和K_{3,3} K5K3,3是非平面图
    • 圈的边数决定了平面图面的度数
    • 每个面至少由三条边组成,平面图必有 ϵ ≤ 3 ν − 6 ( ν ≥ 3 ) \epsilon\leq3\nu-6(\nu\geq3) ϵ3ν6(ν3)
    • 极大平面图的平面嵌入每个面都是三角形( ϵ = 3 v − 6 \epsilon=3v-6 ϵ=3v6)
    • 至少3个顶点的极大平面图不含割点割边
    • 顶点数大于等于4的极大平面图 δ ≥ 3 \delta\geq3 δ3

匹配

  • 一些证明思想
    • M M M G G G的最大匹配当且仅当 G G G种没有关于 M M M的可增长轨道(反证,对称差)
    • Z = { v ∣ v ∈ V ( G ) , 且 u , v 之 间 存 在 交 错 轨 道 } Z=\{v|v\in V(G),且u,v之间存在交错轨道\} Z={vvV(G),u,v} S = X ∩ Z S=X\cap Z S=XZ T = Y ∩ Z T=Y\cap Z T=YZ
    • 二分图集合划分为 X , Y X,Y X,Y X X X中所有顶点被匹配,当且仅当任给 S ⊆ X , ∣ N ( S ) ∣ ≥ ∣ S ∣ S\subseteq X,|N(S)|\geq|S| SXN(S)S
    • 覆盖大于等于匹配,如果相等,则是最小覆盖和最大匹配
    • 二分图的匹配数等于覆盖数
    • G G G有完备匹配,当且仅当任取 S ⊆ V ( G ) S\subseteq V(G) SV(G),都有 o ( G − S ) ( 奇 片 个 数 ) ≤ ∣ S ∣ o(G-S)(奇片个数)\leq |S| o(GS)()S
    • 三次正则图有完备匹配
  • 一些算法
    • 交错树算法
      • 输入:二分图 G = ( X , E , Y ) G=(X,E,Y) G=(X,E,Y) G G G的匹配 M M M G G G中没有被 M M M许配的顶点 u u u,不妨假设 u ∈ X u\in X uX
      • 输出: G G G中关于 M M M的u-交错树 T u = ( U , E ′ , V ) T_u=(U,E',V) Tu=(U,E,V)
      • 初始化: U = { u } , E ′ = ∅ , V = ∅ , l p r e ( u ) = ∗ , v ≠ u , l p r e ( v ) = n u l l , l v i s i t e d ( v ) = 0 U=\{u\},E'=\varnothing,V=\varnothing,l_{pre}(u)=*,v\neq u,l_{pre}(v)=null,l_{visited}(v)=0 U={u},E=,V=,lpre(u)=,v=u,lpre(v)=null,lvisited(v)=0
      • 找非M中的边:若存在 x ∈ X , l p r e ( x ) ≠ n u l l , l v i s i t e d ( x ) = 0 x\in X,l_{pre}(x)\neq null,l_{visited}(x)=0 xX,lpre(x)=null,lvisited(x)=0,则对 Y Y Y中所有满足 x y ∈ E − M xy\in E-M xyEM l p r e ( y ) = n u l l l_{pre}(y)=null lpre(y)=null的顶点 y y y,令 l p r e ( y ) = x ; E ′ ← E ′ ∪ x y ; V ← V ∪ { y } l_{pre}(y)=x;E'\leftarrow E'\cup{xy};V\leftarrow V\cup\{y\} lpre(y)=x;EExy;VV{y},最后令 l v i s i t e d ( x ) = 1 l_{visited}(x)=1 lvisited(x)=1
      • 找M中的边:若存在 y ∈ Y , l p r e ( y ) ≠ n u l l , l v i s i t e d ( y ) = 0 y\in Y,l_{pre}(y)\neq null,l_{visited}(y)=0 yY,lpre(y)=null,lvisited(y)=0,则对 X X X中所有满足 x y ∈ M xy\in M xyM l p r e ( x ) = n u l l l_{pre}(x)=null lpre(x)=null的顶点 x x x,令 l p r e ( x ) = y ; E ′ ← E ′ ∪ x y ; U ← V ∪ { x } l_{pre}(x)=y;E'\leftarrow E'\cup{xy};U\leftarrow V\cup\{x\} lpre(x)=y;EExy;UV{x},最后令 l v i s i t e d ( y ) = 1 l_{visited}(y)=1 lvisited(y)=1
      • 算法结束:找到可增长轨道(V中加入未被许配的顶点)立马结束,或没有新顶点加入U(无可增长轨道)
    • 匈牙利算法
      • 输入:二分图 G = ( X , E , Y ) G=(X,E,Y) G=(X,E,Y)
      • y输出: G G G的最大匹配 M M M
      • 初始化: G G G的一个初始匹配 M M M,如 M = ∅ , G ′ ← G M=\varnothing,G'\leftarrow G M=,GG
      • 找交错树: G G G中没有被 M M M许配的顶点 u u u,搜索u-交错树 T u T_u Tu,若找到可增长轨道,设为 P P P,令 M ← M ⊕ E ( P ) M\leftarrow M\oplus E(P) MME(P)(将 P P P上属于 M M M与不属于 M M M的交换),否则 G ′ ← G ′ − V ( T u ) G'\leftarrow G'-V(T_u) GGV(Tu)
      • 算法结束 G ′ G' G为空,或 G ′ G' G中顶点都被 M M M许配,否则循环上一步

E u l e r Euler Euler图与 H a m i l t o n Hamilton Hamilton

  • 一些证明思想
    • E u l e r Euler Euler图每个顶点的度数都是偶数,且是无公共边的圈之并
    • G G G H a m i l t o n Hamilton Hamilton图,则任取 S ⊆ G S\subseteq G SG w ( G − S ) ≤ ∣ S ∣ w(G-S)\leq|S| w(GS)S(取 H a m i l t o n Hamilton Hamilton圈)
    • 取极大的非 H a m i l t o n Hamilton Hamilton图,加任意一条边后的图的每个 H a m i l t o n Hamilton Hamilton圈都包含新加的边
    • ν ( G ) ≥ 3 , δ ( G ) ≥ ν ( G ) / 2 \nu(G)\geq3,\delta(G)\geq\nu(G)/2 ν(G)3,δ(G)ν(G)/2,则 G G G H a m i l t o n Hamilton Hamilton
    • 简单图 G G G H a m i l t o n Hamilton Hamilton图,当且仅当它的闭包 c ( G ) ( 连 接 度 数 和 不 小 于 顶 点 数 的 所 有 边 ) c(G)(连接度数和不小于顶点数的所有边) c(G)() H a m i l t o n Hamilton Hamilton
    • ν ( G ) ≥ 3 \nu(G)\geq3 ν(G)3,任取 u , v ∈ V ( G ) u,v\in V(G) u,vV(G) d e g ( u ) + d e g ( v ) ≥ ν ( G ) − 1 deg(u)+deg(v)\geq\nu(G)-1 deg(u)+deg(v)ν(G)1,则 G G G H a m i l t o n Hamilton Hamilton轨道, d e g ( u ) + d e g ( v ) ≥ ν ( G ) deg(u)+deg(v)\geq\nu(G) deg(u)+deg(v)ν(G),则 G G G H a m i l t o n Hamilton Hamilton图。
  • 一些算法
    • F l e u r y Fleury Fleury算法
      • 输入:图 G = ( V ( G ) , E ( G ) ) G=(V(G),E(G)) G=(V(G),E(G)),输出:图 G G G的一条行迹
      • 从任意一点不断加边,新的顶点继续加边,若有桥则最后选桥
    • 逐步插入回路算法
      • 输入:Euler图 G = ( V ( G ) , E ( G ) ) G=(V(G),E(G)) G=(V(G),E(G)),输出:图 G G G的一条Euler回路
      • 找圈,每找到一个圈判断是否已找全 G G G,没有则找到与该圈中顶点相关联的边,将刚刚的圈改为以该顶点为起点(终点)的圈,继续找圈。
    • 最近邻法
      • 输入:加权图 G = ( V ( G ) , E ( G ) , w ( G ) ) G=(V(G),E(G),w(G)) G=(V(G),E(G),w(G)),顶点 v 1 v_1 v1,输出:图 G G G的一条 H a m i l t o n Hamilton Hamilton
      • 一句概括:找与P中最后顶点的最近顶点作为下一顶点
      • 复杂度 O ( v 2 ) O(v^2) O(v2)
      • d d 0 ≤ 1 2 ( ┌ l o g 2 n ┐ + 1 ) \frac{d}{d_0}\leq \frac{1}{2}(\ulcorner log_2n\urcorner+1) d0d21(log2n+1).
    • 最小生成树法
      • 输入:加权图 G = ( V ( G ) , E ( G ) , w ( G ) ) G=(V(G),E(G),w(G)) G=(V(G),E(G),w(G)),输出:图 G G G的一条 H a m i l t o n Hamilton Hamilton
      • 造Euler图,找Euler回路:找最小生成树 T T T,将 T T T中各边都添加一条平行边,所得图为 G ∗ G^* G G ∗ G^* G为Euler图,从 v v v出发找 E u l e r Euler Euler回路 C v C_v Cv
      • 抄近路 E u l e r Euler Euler回路跳过已访问过的结点得到的 H a m i l t o n Hamilton Hamilton
      • 复杂度 O ( v 2 ) O(v^2) O(v2)
      • d d 0 < 2 \frac{d}{d_0}<2 d0d<2.
    • 最小权匹配法
      • 输入:加权图 G = ( V ( G ) , E ( G ) , w ( G ) ) G=(V(G),E(G),w(G)) G=(V(G),E(G),w(G)),输出:图 G G G的一条 H a m i l t o n Hamilton Hamilton
      • 提升最小生成树法:在其算法基础上,另种方法求 E u l e r Euler Euler
      • 求Euler图:设 T T T中度数为奇数的顶点集合为 V 0 = { v 1 , v 2 , ⋯   , v 2 k } V_0=\{v_1,v_2,\cdots,v_2k\} V0={v1,v2,,v2k},求 V 0 V_0 V0的导出子图 G [ V 0 ] = K 2 k G[V_0]=K_{2k} G[V0]=K2k中总权最小的完备匹配 M M M,将 M M M中的 K K K条边加到 T T T上,得到Euler图 G ∗ G^* G
      • d d 0 < 3 2 \frac{d}{d_0}<\frac{3}{2} d0d<23.

图的着色

  • 一些证明思想
    • X ( G ) ≤ Δ ( G ) + 1 X(G)\leq\Delta(G)+1 X(G)Δ(G)+1.
    • 有边二分图 X ( G ) = 2 X(G)=2 X(G)=2 X ′ ( G ) = Δ ( G ) X'(G)=\Delta(G) X(G)=Δ(G),有奇圈的图 X ( G ) ≥ 3 X(G)\geq 3 X(G)3
    • 证明某图的某色数为一个值,可证小于等于该值和大于等于该值
    • 证明色数时,可引入Euler回路或Hamilton圈。
    • 最佳k-边着色有一点关联的边中至少出现两次同一颜色另一颜色未出现,则两颜色的边导出子图必有奇圈
    • 二分图图 G G G存在 p p p个不相交匹配, └ ϵ / p ┘ ≤ ∣ M i ∣ ≤ ┌ ϵ / p ┐ \llcorner\epsilon/p\lrcorner\leq |M_i|\leq\ulcorner\epsilon/p\urcorner ϵ/pMiϵ/p(课表排课问题)
    • k k k面着色的连通无环平面图当且仅当其对偶图可k-顶点着色。(平面图的对偶图必连通)
    • 任何平面图都是可5-顶点着色的

有向图

  • 一些证明思想
    • D D D是强连通有向图当且仅当 D D D中存在有向生成回路
    • 连通无向图 G G G可定向成强连通有向图,当且仅当 G G G中无桥
    • D D D是单向连通有向图,当且仅当 D D D中存在有向生成路径
    • 有向图 D D D中含有长度为 X ( G ) − 1 X(G)-1 X(G)1的有向轨道,其中 G G G D D D的底图
    • 竞赛图(完全图的定向图)必有有向 H a m i l t o n Hamilton Hamilton轨道
    • 严格有向图 D D D(无环无重边的有向图),若 m i n { δ − , δ + } ≥ v 2 > 1 min\{\delta^-,\delta^+\}\geq \frac{v}{2}>1 min{δ,δ+}2v>1,则 D D D是有向 H a m i l t o n Hamilton Hamilton

网络流理论

  • 一些证明思想
    • 流函数的定义(各边函数小于容量,非源与汇的入流与出流相加必为零)
    • 截量 C ( S , S ‾ ) C(S,\overline{S}) C(S,S)是容量的和,截 ( S , S ‾ ) (S,\overline{S}) (S,S)是边的集合
    • 某流函数的流量等于某截的截量,则该函数为最大流,该截为最小截
    • 伴随网络加入新源 s ′ s' s新汇 t ′ t' t,加所有边, c ′ ( e ) = { c ( e ) − b ( e ) , e ∈ E ( D ) ∑ e ∈ α ( v ) b ( e ) , e = ( s ′ , v ) , v ∈ V ( D ) ∑ e ∈ β ( v ) b ( e ) , e = ( v , t ′ ) , v ∈ V ( D ) + ∞ , e = ( s , t ) 或 ( t , s ) c'(e)=\begin{cases}c(e)-b(e), & e\in E(D)\\ \sum_{e\in\alpha(v)}b(e), & e=(s',v),v\in V(D) \\ \sum_{e\in\beta(v)}b(e), & e=(v,t'),v\in V(D) \\ +\infty, & e=(s,t)或(t,s)\end{cases} c(e)=c(e)b(e),eα(v)b(e),eβ(v)b(e),+,eE(D)e=(s,v),vV(D)e=(v,t),vV(D)e=(s,t)(t,s).
    • 附加网络加入源 x 0 x_0 x0与汇 y 0 y_0 y0 x 0 x_0 x0和产地加边, y 0 y_0 y0和售地加边, c ′ ( e ) = { c ( e ) , e ∈ E ( D ) σ ( x i ) , e = ( x 0 , x i ) ρ ( y j ) , e = ( y j , y 0 ) c'(e)=\begin{cases}c(e), & e\in E(D)\\ \sigma(x_i), & e=(x_0,x_i) \\ \rho(y_j), & e=(y_j,y_0)\end{cases} c(e)=c(e),σ(xi),ρ(yj),eE(D)e=(x0,xi)e=(yj,y0).
  • 一些算法
    • 可增载轨道算法
      • 输入:网络 N = ( D , s , t , c ) N=(D,s,t,c) N=(D,s,t,c),流函数 f f f
      • 输出:一条可增载轨道,或指出当前流函数是最大流
      • 初始化: S = { s } S=\{s\} S={s};令 p r e v ( s ) = ∗ prev(s)=* prev(s)=
      • 扩增轨道1:若存在 u ∈ S , v ∈ S ‾ u\in S,v\in \overline{S} uS,vS,使得 ( u , v ) ∈ E ( D ) (u,v)\in E(D) (u,v)E(D) f ( ( u , v ) ) < c ( ( u , v ) ) f((u,v))<c((u,v)) f((u,v))<c((u,v)),则令 S ← S ∪ { v } , p r e v ( v ) = u S\leftarrow S\cup\{v\},prev(v)=u SS{v},prev(v)=u
      • 扩增轨道2:当扩增轨道1无法增加时,若存在 u ∈ S , v ∈ S ‾ u\in S,v\in \overline{S} uS,vS,使得 ( v , u ) ∈ E ( D ) (v,u)\in E(D) (v,u)E(D)且边 ( v , u ) (v,u) (v,u)正载,则令 S ← S ∪ { v } , p r e v ( v ) = u S\leftarrow S\cup\{v\},prev(v)=u SS{v},prev(v)=u
      • 结束条件:两方法均无法扩增或 t ∈ S t\in S tS时,结束算法
    • F o r d − F u l k e r s o n Ford-Fulkerson FordFulkerson最大流算法
      • 输入:网络 N = ( D , s , t , c ) N=(D,s,t,c) N=(D,s,t,c)
      • 输出:最大流函数 f f f
      • 初始化:取初始流函数 f f f,如 f ( e ) ≡ 0 f(e)\equiv0 f(e)0
      • 构造新流函数:调用可增载轨道算法。若找到可增载轨道 P ( s , t ) P(s,t) P(s,t),如引理当中一样,构造新的流函数 f ‾ = { f ( e ) + l ( P ) , e 是 正 向 边 f ( e ) − l ( P ) , e 是 反 向 边 f ( e ) , e 其 它 \overline{f}=\begin{cases}f(e)+l(P),&e是正向边\\ f(e)-l(P),&e是反向边\\f(e),&e其它\end{cases} f=f(e)+l(P),f(e)l(P),f(e)eee,直至无法找到可增载轨道,算法结束
    • 容量有上下界网络的最大流算法
      • 输入:容量有上下界网络 N = ( D , s , t , b , c ) N=(D,s,t,b,c) N=(D,s,t,b,c)
      • 输出:最大流函数 f f f,或断定 N N N没有可行流
      • 构造 N ′ N' N;构造 N N N的伴随网络 N ′ N' N
      • N ′ N' N最大流函数:用 2 F 2F 2F算法求 N ′ N' N的最大流函数 f ′ f' f
      • 判断:若不满足 f ′ ( ( s ′ , v ) ) = c ′ ( ( s ′ , v ) ) f'((s',v))=c'((s',v)) f((s,v))=c((s,v)),则结束算法无可行流,否则令 f ( e ) = f ′ ( e ) + b ( e ) f(e)=f'(e)+b(e) f(e)=f(e)+b(e)
      • N N N最大流函数:以 f f f作为初始流函数, 2 F 2F 2F算法即可
    • 有供需约束网络的可行流算法
      • 输入:有供需约束的网络 N = ( D , X , Y , σ , ρ , c ) N=(D,X,Y,\sigma,\rho,c) N=(D,X,Y,σ,ρ,c)
      • 输出: N N N的可行流函数 f f f,或断定 N N N没有可行流
      • 构造 N ′ N' N;构造 N N N的附加网络 N ′ N' N
      • N ′ N' N最大流函数:用 2 F 2F 2F算法求 N ′ N' N的最大流函数 f ′ f' f
      • 判断:若不满足 f ′ ( ( y j , y 0 ) ) = c ′ ( ( y j , y 0 ) ) f'((y_j,y_0))=c'((y_j,y_0)) f((yj,y0))=c((yj,y0)),则结束算法无可行流,否则令 f ( e ) = f ′ ( e ) f(e)=f'(e) f(e)=f(e) f ( e ) f(e) f(e)即为 N N N的可行流,算法结束

图矩阵与图空间

  • 一些证明思想
    • ∀ α , β ∈ V ′ , ∀ k , l ∈ F \forall \alpha,\beta\in V',\forall k,l\in F α,βV,k,lF,都有 k α + l β ∈ V ′ k\alpha+l\beta\in V' kα+lβV,则 V ′ V' V V V V的线性子空间
    • C ( G ) C(G) C(G)圈空间是 ϵ ( G ) \epsilon(G) ϵ(G)边空间线性子空间,基为基本圈组(生成树加边),维数 ϵ − ν + 1 \epsilon-\nu+1 ϵν+1
    • S ( G ) S(G) S(G)断集空间是 ϵ ( G ) \epsilon(G) ϵ(G)边空间线性子空间,基为割集,维数 ν − 1 \nu-1 ν1
    • 任给连通图 G G G的圈向量和断记向量,内积为0
    • τ ( D ) = d e t ( B f ( D ) × B f T ( D ) ) \tau(D)=det(B_f(D)\times B^T_f(D)) τ(D)=det(Bf(D)×BfT(D)). D D D为无环连通无向图的任意定向的有向图
  • 一些算法
    • W a r s h a l l Warshall Warshall算法
      • 输入:有向图 D D D的邻接矩阵 A ( D ) = ( a i j ) v × v A(D)=(a_{ij})_{v\times v} A(D)=(aij)v×v
      • 输出:可达性矩阵 R ( D ) = ( r i j ) v × v R(D)=(r_{ij})_{v\times v} R(D)=(rij)v×v,若 v i v_i vi G G G中可达 v j v_j vj,则 r i j = 1 r_{ij}=1 rij=1,否则 r i j = 0 r_{ij}=0 rij=0
      • 初始化:对所有 1 ≤ i ≤ v , r i i ( 0 ) = 0 1\leq i\leq v,r_{ii}^{(0)}=0 1iv,rii(0)=0,对所有 1 ≤ i , j ≤ v 1\leq i,j\leq v 1i,jv,若 a i j > 0 a_{ij}>0 aij>0,令 r i j ( 0 ) = 1 r_{ij}^{(0)}=1 rij(0)=1,否则 r i j ( 0 ) = 0 r_{ij}^{(0)}=0 rij(0)=0,令 l = 0 l=0 l=0
      • 对所有的 1 ≤ i ≤ v 1\leq i\leq v 1iv,若 r i ( l + 1 ) ( l ) r_{i(l+1)}^{(l)} ri(l+1)(l)=1,则对所有的 1 ≤ j ≤ v 1\leq j\leq v 1jv,令 r i j ( l + 1 ) = r i j ( l ) ∨ r ( l + 1 ) j ( l ) r_{ij}^{(l+1)}=r_{ij}^{(l)}\vee r_{(l+1)j}^{(l)} rij(l+1)=rij(l)r(l+1)j(l) l = l + 1 l=l+1 l=l+1;否则,令 r i j ( l + 1 ) = r i j ( l ) r_{ij}^{(l+1)}=r_{ij}^{(l)} rij(l+1)=rij(l) l = l + 1 l=l+1 l=l+1,直至 l = v l=v l=v,算法停止
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们要将一棵树均匀划分成 $k$ 个子树,我们可以考虑对树进行一次 DFS,记录每个节点的子树大小(包括自身),然后将根节点的子树大小设为 $s$,则我们需要将大小为 $\frac{s}{k}$ 的若干个连续子树合并成一个子树,以此类推,直到所有子树大小均不超过 $\frac{s}{k}$。 具体实现可以使用一个递归函数,输入参数为当前节点以及子树大小 $s$,输出为当前子树是否需要合并成一个新的子树。代码如下: ```python def dfs(node, s, k): if s < k: # 子树大小小于 k,无法分割 return False if len(node.children) == 0: # 叶节点,不需要分割 return False sizes = [dfs(child, s, k) or child.size for child in node.children] sizes.sort() cnt = 0 for i in range(0, len(sizes), k): if sum(sizes[i:i+k]) < s: # 当前子树大小不超过 s/k cnt += 1 return cnt > 1 # 如果有超过 1 个子树需要合并,则返回 True,否则返回 False ``` 然后我们可以从根节点开始调用这个函数,找到需要合并的子树并进行合并即可。代码如下: ```python def split_tree(root, k): s = root.size while dfs(root, s, k): sizes = [(child, dfs(child, s, k) or child.size) for child in root.children] sizes.sort(key=lambda x: x[1], reverse=True) for i in range(0, len(sizes), k): children = [child for child, _ in sizes[i:i+k]] new_node = Node() # 创建一个新节点作为当前子树的根节点 new_node.children = children root.children = [child for child, size in sizes if size not in range(i, i+k)] root.children.append(new_node) s = s // k ``` 其中 `Node` 是树节点的定义,`size` 表示以当前节点为根节点的子树大小,`children` 表示当前节点的子节点列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值