C15 Test1 T1

Keywords in questions Similar Words in this passage
surrounds the fruit The fruit is encased in
breaks open splits into
revealed the exact location of knew where
brought to the exclusive importers of
restricted nutmeg production concentrated all nutmeg production
put lime on was covered with lime
were secretly taken to smuggled
were destroyed by wiped out

C15 Test 3 Part 2

Keywords in questions Similar Words in this passage
be used in different locations is easy to transport
are caught in be shaken to remove
A screen displays is shown on an LCD screen
requires servicing rovides servicing when necessary
Getting the finance mainly finding
Profit not the primary goal We are a venture with a social mission.

C15 Test 3 Part 3

Keywords in questions Similar Words in this passage
details of the plot show considerable global variation the same story often takes a variety of forms
the reason for their survival survival-relevant information
social significance importance in human society.
were originally spoken recorded from oral traditions
events episodes
some sort of warning he cautionary elements
horror fear
links were indeed related
have a deeper significance matter

C15 Test 4 Part 1

Keywords in questions Similar Words in this passage
survive periods of drought withstand years of drought
becoming turns into
fuel charcoal for cooking and heating

C15 Test 4 Part 2

Keywords in questions Similar Words in this passage
the children of Gomera now learn has been taught in all of the island’s elementary schools.
represent recoded into
direction is changed adjust the direction
brief short
because of new technology with modern communication technology
receive a UNESCO award get an award from

C15 Test 4 Part 3

Keywords in questions Similar Words in this passage
moral standards our sense of justice
control by governments government regulation
is environmentally aware involvement
prevented unprofitable and illegal
the action of ordinary people directly or through its politicians
The public should be prepared to fund good environmental practices public must accept the necessity for higher prices for products to cover the added costs, if any, of sound environmental practices.
make a clear distinction a moralistic one about who is right or wrong, admirable or selfish, a good guy or a bad guy.

C16 Test 1 Part 1

Keywords in questions Similar Words in this passage
without food, depleting their own calcium and calorie reserves fasting
one day be used by people potentially benefit
unintelligent stupid
dislodge knock down
similar to appeared to be
suggesting seemingly out of
disappointed missed out

C16 Test 1 Part 2

Keywords in questions Similar Words in this passage
be as big as an Egyptian city was the size of a city in ancient Egypt
accommodation living quarters
was occupied by priests for the priests
encircled ringed by
less definite The evolution has been written and argued
a single certainty there is no question
the few remains a small number of his valuables

C16 Test 1 Part 3

Keywords in questions Similar Words in this passage
recommendations instructions
reliance become dependent on
intuition human instinct
increase users’ confidence more trustworthy
lower employment On the subject of job losses
Just as has parallels with
conventional career path The traditional trajectory
Authorities governments
guarantee ensure

C16 Test 2 Part 1

Keywords in questions Similar Words in this passage
only simply
no longer visible disappeared
of the surrounding soil on soil from two of the lower layers

C16 Test 2 Part 2

Keywords in questions Similar Words in this passage
continue to exist for longer than have populated this planet since long before
partnership symbiotic relationship
upsetting disrupting
nutrition diets
cleanliness hygiene
excessive focus on obsession

C16 Test 2 Part 3

Keywords in questions Similar Words in this passage
A basic assumption about wisdom empirical research examining wisdom
be underestimated more powerful than previously imagined
modesty humility, recognition of the limits of our own knowledge
with objectivity from a third-party perspective
fairness justice

其他

Keywords in questions Similar Words in this passage
cease stop
the majority of most of
conscious well-considered

图论7-Network Flows

Matching

图$G$中的**极大匹配(**maximal matching)是指不能添加更多的边的匹配;最大匹配(maximum matching)是指图$G$中拥有最多边数的匹配;

  • 显然每个最大匹配都是极大的,反之未必;

给定匹配$M$,一个$M$-交替路径是指一个交替选择$M$中的边和不在$M$中的边的路径;一个$M$-增广路径是指其两个端点不被$M$浸润的$M$-交替路径;

  • 给定$M$-增广路径$P$,我们可以替换$M$中的边形成多一条的边的新的匹配$M’$;

对于定义在顶点集$V$上的图$G,H$,其对称差(symmetric difference)$G\triangle H$定义为顶点集为$V$,边集中的边只属于$G$和$H$其中之一的图,通常具有异或(exclusive-or)性质;

对于两个匹配$M,M’$,$M\triangle M’=(M-M’)\cup(M’-M)$;

对于二部图$G(V_1;V_2)$,一个完美匹配是指一个从$V_1$到$V_2$的一对一的对应关系使得每个具有对应关系的顶点都相邻;

结婚条件(Marriage condition)形象来说一组$k$个女孩d至少总共认识$k$个男孩;

Lemma

两个匹配的对称差的每个分量是偶圈或者路径;

proof:注意到$\Delta(F)\le 2,\chi’(F)=2$;

Theorem(Berge)

图$G$中的匹配$M$是最大匹配当且仅当$G$中没有$M$增广路径;

proof: 充分性显然,下证必要性,若$M$没有增广路径也不是最大匹配,取$G$中的最大匹配$M’$,令$F=M\triangle M’$,$F$只包含偶圈和路径,注意到$\mid M’\mid>\mid M\mid$,$F$必须包含一个分量是路径,其两个端点属于$M’$的边,这个路径就是$M$的增广路径,矛盾;

Theorem(Hall)

对于二部图$G(X;Y)$,存在$X$到$Y$的完美匹配的充分必要条件是对任意子集$S\sube X$,均有$\mid S\mid\le \mid N(S)\mid$;

proof:这说明结婚条件是充分必要的;必要性显然,下证充分性

取$G$中的最大匹配$M$,$M$没有浸润$X$,我们说明存在子集$S\sub X$使得$\mid N(S)\mid< \mid S\mid$;

取$u\in X$且$u$未被$M$浸润,取$u$通过$M$交替路径到达的所有点中在$X$的部分为$S$,在$Y$中的部分为$T$,注意有$u\in S$;

image-20250112155607024

  • 断言:$M$匹配$T$和$S-{u}$

    每个在$S-{u}$的顶点都可以通过$M$中的一条边到达$T$中顶点;$M$没有增广路径因此$T$中顶点都是浸润的,因此一个到达顶点$y\in T$的$M$交替路径也通过$M$的边到达$S-{u}$,因此有$\mid S-{u}\mid = \mid T\mid$

  • 由于$T\sube N(S)$,于是必有$T=N(S)$,故
    $$
    \mid N(S)\mid=\mid T\mid =\mid{S-{u}}\mid = \mid S\mid -1< \mid S\mid
    $$

由此证明了充分性;

也可以用归纳法证明;也可以使用Menger定理证明;

Corollary

对于$k$-正则的二部图有完美匹配;

proof:统计边数验证满足结婚条件;

Theorem(Konig)

二部图中最大匹配数等于最小点覆盖数;

proof:相互构造

image-20250112162708568

Flow

称两条从$u$到$v$的路径是边不相交的(edge-disjoint),如果它们没有公共边;

称两条从$u$到$v$的路径是点不相交的(vertex-disjoint),如果它们没有公共点;

考虑图$G$中不相邻的两个顶点$v,w$,$vw$断集(vw-disconnected set)指图$G$中的一个边集$E$,每条从$v$到$w$的路径包括$E$中的一条边;$vw$分离集(vw-seperated set)指图$G$中的一个点集$S$,每条从$v$到$w$的路径包括$S$中的一条点;

一个网络(network)$N$是一个带权有向图,每一条箭头$a$分配一个容量$c(a)$;

一个(flow)$f$为每个箭头分配一个流量$f(a)$;

对于顶点$v$,定义流出量$f^+(v)$为离开$v$的箭头总流量,流进量$f^-(v)$为进入$v$的箭头总流量;

称一个流$f$是可行(feasible),如果满足

  • 流量约束:对于每个箭头$a$,$f(a)\le c(a)$;
  • 守恒约束:对于每个顶点$v$,$f^+(v)=f^-(v)$;

零流显然是可行,定义流的净流量/值为在汇点$t$处
$$
f^-(t)-f^+(t)
$$
一个最大流是一个拥有最大净流量的可行流;

对于网络$N$中的流$f$,一个$f$增广路径(f-augmenting path)是一个从源点$s$到汇点$t$的路径$P$,在底图$G$中的边$e\in E(P)$满足如下性质:

  • 若$P$在$e$上同向,则$f(e)< c(e)$,定义$\epsilon(e)=c(e)-f(e)$;
  • 若$P$在$e$上反向,则$f(e)>0$,定义$\epsilon(e)=f(e)$;

称路径$P$的容忍度(tolerance)为
$$
\min_{e\in E(P)} \epsilon(e)
$$
一个$f$增广路径对应一个大值流,这样的定义确保了容忍度为正;

一个s/t割(source/sink cut)$[S,T]$由点集$S$出发的到点集$T$的箭头组成,$S,T$构成点集的划分;

源/汇割的容量${\rm cap}(S,T)$,是这些箭头的总容量;

一个最小割是指拥有最小总容量的割;

image-20250113154526967

Theorem(Menger)

连通图$G$中相异顶点$v,w$之间的边不相交路径最大条数等于$vw$不连通集的最少边数;

proof:显然后者不超过前者,只需证明前者不超过后者即可;

对边数归纳,考虑非平凡情况,假设图$G$中最小的$vw$不连通集$E$的边满足$\mid E\mid =k$

  • 不是所有的边和$v$相关联
  • 不是所有的边和$w$相关联

$G-E$有两个分别包括顶点$v,w$的不相交的子图$V,W$;

定义$G_1$为$G$收缩$V$中的每一条边形成的图,$G_2$为类似收缩$W$的每一条边形成的;由归纳假设,$G_1,G_2$给出$k$个边不相交的路径,所求的$k$个边不相交路径显然就是给出的路径的并;

对于平凡情况,可以假设$G$中每条边都在$E$中,否则可以删去它使用归纳假设,考虑$vw$间的最短路$P$,$P$包括至多一条边在$E$中;对$G-E(P)$采用归纳假设,至少有$k-1$条边不相交路径,算上$P$即可;

Theorem(Menger)

连通图$G$中相异顶点$v,w$之间的点不相交路径最大条数等于$vw$分离集的最少点数;

Corollary

对于图$G$是$k$-连通的当且仅当任意相异顶点之间有至少$k$条边不相交的路径;

对于至少有$k+1$个顶点的图$G$,$G$是$k$-连通的当且仅当任意相异顶点间至少有$k$个点不相交的路径;

值得一提的是,Menger定理对有向图也成立,因此一般表述成连通图中最大流等于最小割;手动添加两个顶点也可证明Hall定理;

Lemma

令$P$是$f$增广路径,具有容忍度$z$,通过以下方式改变流

  • $+z$:在与$P$同向的箭头上
  • $-z$:在与$P$反向的箭头上

形成的新可行流$f’$,其值${\rm val}(f’)={\rm val}(f)+z$

Theorem(Max-flow Min-cut)

在任意网络中,最大流的值等于最小割的容量;

proof:容量为整数情形时可以看作Menger定理视作有向图中连接对应容量个箭头;

只需要找到一个流值等于一个割流量即可;

取$f$为最大流,如下定义点集划分$S,T$:点$z\in S$当且仅当存在路径$v=v_0\to v_1\to \cdots \to v_{m-1}\to v_m = z$使得$\epsilon(v_iv_{i+1})>0$或$\epsilon(v_{i+1}v_i)=f(v_{i+1v_i})>0$

由引理,源点$s\in S$,汇点$t\in T$;显然对每个$(x,z)\in [S,T]$,有$\epsilon(xz)=0$,对于每个$[z,x]\in [T,S]$,我们有$f(z,x)=0$,否则$z$应该属于$s$;

因此有
$$
{\rm cap}([S,T])={\rm val}(f)
$$
$[S,T]$是所求的最小割;

Algorithm(Ford-Fulkerson)

image-20250113171531290

图论6-Digraph

Conceptions

有向图(directed graph)$D(V;A)$定义为非空有限顶点集$V$和$V$的有序对(箭头,arcs)形成的有限簇$A$;

箭头的第一个顶点为(tail),第二个顶点为(head),箭头由尾指向头;

有向图消去方向后得到的无向图称作底图(underlying grapg);

称$D$为简单有向图(simple digraph),如果 $D$中所有箭头都不一样,且没有自环;

称两个有向图同构(isomorphic),如果它们的底图同构且箭头保持相同的方向;

有向图$D$的邻接矩阵$A(D)$定义为$A=(a_{ij}){n\times n}$,$a{ij}$为$v_i$指向$v_j$的箭头数;

关联矩阵$M(D)$定义为$M=(m_{ij}){n\times n}$,$m{ij}=1$如果$v_i$是$e_j$的尾,$m_{ij}=-1$如果$v_i$是$e_j$的头;

有向图的是指箭头的有限序列;

称有向图为弱连通的,如果它不能表示为两个有向图的并,当且仅当其底图是连通的;

称有向图为强连通的,如果任何两个顶点$u,v$.均有从$u$到$v$的有向路径;

有向图的强连通分量是其最大化的强连通子图;

称图$G$为可定向的(orientable)如果图$G$的每个边可以标定方向使得形成的有向图是强连通的;

称有向图$D$是欧拉图,如果存在闭合迹包含$D$中所有的箭头,这样的迹称作欧拉迹

对于有向图$D$的顶点$v$,出度(out-degree)$d^+(v)$定义为以$v$为尾的箭头数,入度(in-degree)$d^-(v)$定义为以$v$为头的箭头数;

称顶点$v$为有向图$D$的源点(source),如果$d^-(v)=0$;

称顶点$v$为有向图$D$的汇点(source),如果$d^+(v)=0$;

称有向图$D$是哈密顿的(Hamiltonian),如果存在一个有向圈包括所有顶点;

称有向图$D$是半哈密顿的(semi-Hamiltonian),如果存在一个有向路径包括所有顶点;

Theorem(Robbin)

对于连通图$G$,若$G$是可定向的当且仅当$G$是2-边连通的,即每条边至少被一个圈包含;

proof:必要性显然,充分性只需按照以下算法标方向即可:

  1. 选取任意一个圈$C$,周期性地表明它的边的方向;

  2. 选取不在$C$中但是和$C$相关联的边$e$;

    $e$不是桥,假设$e$被包含在$C’$中,令$C=C’$,回到1;

Theorem(Handshaking dilemma)

$$
\sum_{v\in V(D)}d^+(v)=\sum_{v\in V(D)}d^-(v)=E(D)
$$

Theorem

连通有向图$D$是欧拉的当且仅当对于$D$中任何顶点$v$均有$d^+(v)=d^-(v)$;

Theorem(Ghouila-Houri)

令有向图$D$是具有$n$个顶点的强连通图;如果$d^+(v)\ge \frac{n}{2},d^-(v)\ge \frac{n}{2}$,则$D$是哈密顿的;

Tourament

竞赛图(tourament)定义为任何两个顶点都有箭头相连的有向图;

Theorem(Redei)

任何非哈密顿的竞赛图$T$都是半哈密顿的;(竞赛图必有哈密顿路)

proof:对顶点数归纳,取$v_n\in T$,由归纳假设,取路径$v_0\to v_1\to \cdots\to v_{n-1}$,若$v_n\to v_0$或$v_{n-1}\to v_n$,直接加在头尾即可;否则存在$i$是最小的满足$v_i\to v_n\to v_{i+1}$的下标,则哈密顿路为$v_0\to v_1\to \cdots v_i\to v_n\to v_{i+1}\to \cdots\to v_{n-1}$;

Theorem(Moon)

竞赛图$D$都是哈密顿的当且仅当$D$是强连通的;

proof:必要性显然,充分性归纳证明更强结论:对于任意$k(3\le k\le n)$,存在长度为$k$的圈;若当前圈之外存在一个顶点对圈既有出边也有入边,找到插入的下标即可得到更长圈;

image-20250113204028589

否则可以划分为对圈只有出边和点集$W$和对圈只有入边的点集$Z$,$W$到$Z$必存在一条入边,考虑去掉圈中一点加入该边即可得到更长圈;

image-20250113204044553

图论5-Coloring

Vertex Coloring

为图的每个顶点分配某种颜色,称一种着色是正确的,如果没有两个相邻的顶点着色相同;

一个独立集(independent set)是指内部没有任意两个点相邻的点集;

因此,在一个正确的着色中,位于不同独立集的点集可以被不同颜色着色;

一个$k$-点着色的无环图可以被划分为$k$个独立集$V_1\cup V_2\cup \cdots\cup V_k$;

图的一个$k$-点着色是用$k$个颜色对其顶点进行着色;若图是一个$k$-点可着色的,如果图有一个正确的$k$-点着色方式;

图$G$的色数(chromatic number)$\chi (G)$等于最小的使得$G$是$k$-点着色的整数;

称图$G$是$k$-色(k-chromatic)图,如果$\chi(G)=k$;

确定一个图是否是3-可着色的是一个NPC问题,对于平面图,计算机已经证明四色定理:对于任何平面图$G$均有$\chi(G)\le 4$;

对于给定的图确定色数是一个NP问题,但是色数有一个平凡上界$\chi(G)\le n$;

Theorem

$$
\chi(K_n)=n\
\chi(C_n)=2+(n% 2)\
$$

值得一提的是,Petersen图的色数为3;

Theorem

$$
\chi(G)\le \Delta(G)+1
$$

Proof:以下贪心算法是一种 正确的着色方案,这说明我们找到了色数的一个上界;

假设第$i$个颜色记作$C_i$,列举图$G$的顶点$v_1,v_2,\cdots.v_n$;

  1. 为$v_1$分配颜色$C_1$;
  2. 对于状态$i+1$,假定$v_1,v_2,\cdots,v_i$已经着色,分配$v_{i+1}$颜色$C_j$,$j$为$v_{i+1}$相邻顶点尚未使用的颜色最小下标;

等号在奇圈和完全图上成立;

Five-color Theorem

简单平面图是5-可着色的;

proof:对$|V(G)|$归纳,若$|V(G)|\le 5$,结论平凡,假设$|V(G)|\le n$成立,考虑度数最小的点$v$,一定有$d(v)\le 5$,由归纳假设,对于除去点$v$的图存在$5-$着色方案,若$d(v)\le 4$,则$v$的邻居一定为$v$留出一个颜色;

image-20250106184555304

考虑$d(v)=5$,记邻居顺时针方向为$v_1,v_2,v_3,v_4,v_5$,若这5个点只用了4个颜色,剩下的颜色留给$v$即可;若这5个点颜色各不相同,假设$v_1$染1色,$v_2$染2色,将$v_3$改染1色,$c$染1色的邻居改染2色,依次类推;

image-20250106184606381

若这样的操作不i能持续下去,一定出现如下情况的子图

image-20250106184854521

由平面性,$v_2,v_4$不会有这样的通路,对$v_2,v_4$进行上述操作即可;

image-20250106185019264

进一步,我们有四色定理(Four-color theorem, Appel and Haken):任意简单平面图都是4-可着色的,即$\chi(G)\le 4,\forall G\text{is planar graph}$;

经过对偶图变换可以得知,世界地图可以用4种颜色进行染色;

image-20250106185621087

Brooks Theorem

对于非奇圈的非完全的简单连通图$G$,有$\chi(G)\le \Delta(G)$;

proof:若存在度数小于$\Delta(G)$的顶点$v$,我们需要精心安排顶点的顺序,使得每个顶点在染色时,排在它前面并与之相邻的顶点数不超过$\Delta-1$,以$v$为根的图$G$生成树的后序遍历序列满足条件,因为除$v$外,其余顶点在这棵生成树的父亲一定位于这个点序列的后面;

假设图$G$是$\Delta$正则的;进一步假设$\Delta(G)\ge 3$;

若$G$有割点,取图$G$的割点$v_n$,以及两个连通分量$C_1,C_2$,取$v_1\in C_1,v_2\in C_2$,且$v_1,v_2$均是$v_n$的邻居;

对于$G-{v_n}$的任意连通分量$G_i$,可以对$H_i=G_i\cup{v_n}$进行$k$着色,对这样方案下每个$H_i$的着色顺序进行置换,使得他们在$v_n$的颜色一致;

进一步假设$\kappa(G)=2$,即$G$是2连通的,断言图$G$存在三个顶点$v_1,v_2,v_n$,使得$G-{v_1.v_2}$连通,且
$$
v_1v_n\in E(G),v_2v_n\in E(G),v_1v_2\notin E(G)
$$
先将$v_1,v_2$染成同色,对于$G-{v_1,v_2}$,考虑令$v=v_n$,贪心地为其他点染色后,最后染$v_n$时,由于有两个邻点$v_1,v_2$同色,因此一定留有一种颜色;

下证明断言:若$G$是3连通的,因为$G$是正则且不完全的,故选取距离为2的两点$v_1,v_2$和公共邻点$v_n$即可;

若$G$不是3连通的,但是是2连通的,由于$G$没有割点,每个叶块均有$v_n$的相邻顶点,由于$\Delta \ge 3$,因此可以选取两个不直接相邻的叶块中与$v_n$的邻点$v_1,v_2$;

image-20250106201754800

Map Coloring

在地图着色问题中,不考虑地图之间的桥梁;

image-20250106202314043

定义地图(map)为一个3连通的平面图;

称一个地图是$k$-面可着色的,如果它的面可以被$k$个颜色着色且有公共边相邻的面颜色不同;

Theorem

地图$G$是2-面可着色当且仅当$G$是欧拉图;

proof:对于每个顶点,一定有偶数个围绕它的面(两种颜色的面个数相同),意味着其度为偶数,$G$为欧拉图

如果$G$为欧拉图,则选取任意一个面染为红色,对于其他面,到$F$的曲线穿过偶数条边染为红色,奇数条边染为蓝色,这样的染法是良定义的,因为每个顶点有偶数度

image-20250106203612297

Edge Coloring

图的一个$k$-边着色是用$k$个颜色对其边进行着色;

一个正确的边着色满足任意两个相关联的边颜色不同;

若图是一个$k$-边可着色的,如果图有一个正确的$k$-边着色方式;

不相关联的独立边集合称作一个匹配(matching),更确切地说,在图$G$中的一个匹配$M$是一组互相没有公共顶点无环边集合,称顶点$v$被匹配$M$浸润的(saturated),若$v$关联$M$中的一条边,否则称为未浸润的(unsaturated);

一个正确的$k$-边可着色可以认为对边集进行划分
$$
E=E_1\cup E_2\cup\cdots E_k
$$
其中$E_i$是一个匹配,每个匹配分配相同的颜色;

边色数(edge chromatic number)$\chi’(G)$定义为最小正整数$k$使得$G$为$k$-边可着色的;

一个平凡下界为$\chi’(G)\ge \Delta(G)$;

Theorem

$$
\chi’(K_n)=n-1+(n%2)
$$

对于奇数$n$,任何匹配至多拥有$\frac{n-1}{2}$条边,但是$K_n$有$\frac{n(n-1)}{2}$条边,因此$\chi’(G)\ge n$;

给出$n$-边着色的构造:边界用$n$种颜色染色,对角线的颜色和与之平行的边颜色相同;

image-20250106231317930

对于偶数$n$,我们给出$n-1$-边着色的构造:

取出点$v$,先为$K_{n-1}$子图的用上述方案染色,每个顶点的关联边共$n-2$种颜色,留下一个颜色与$v$相连的边染色即可;

Theorem(Vizing)

对于有限图$G$,两点间最大连边数为$\mu$,则$G$为$\Delta(G)+\mu$-可染色的;

对于简单图来说,$\chi’(G)=\Delta\rm{or}\Delta + 1$

Theorem(Konig)

对于二部图$G$,$\chi’(G)=\Delta(G)$

proof:对边数归纳,假设在较小的边数成立,考虑删除一条边$vw$,子图最大度不超过$\Delta(G)$,对子图$\Delta(G)$边染色,在子图中,$d(v)< \Delta(G),d(w)<\Delta(G)$,因此这样的边染色方案中,$v,w$关联的边至少剩余一种颜色没有使用,设为$c_v,c_w$,若$c_v=c_w$,将$vw$染为该色即可;否则,考虑关联$v$的染$c_w$色的边$vu_1$,依次用$c_v,c_w$色边增广它,得到增广路径不会经过$w$点(因为没有奇圈),反转增广路径的颜色后将$uw$染为$c_w$色即为最终的染色方案;

Chromatic Polynomial

对于简单图$G$,定义色数函数$P_G(k)$为将$G$顶点用$k$种颜色染色,相邻顶点不同色的方案$(f:V(G)\to [k])$数;

Theorem

对于简单图$G$,有
$$
P_G(k)=P_{G-e}(k)-P_{G\cdot e}(k)
$$
proof:考虑删除一条边后的子图之间的关系,$G-e$可以看作边顶点没有限制关系,$G/e$可以看作边顶点必须同色;

显然$P_G(k)$是一个$|V|$次多项式,满足如下性质

  • 系数正负交替;
  • $x^{|V|-1}$的系数是$-|E|$;
  • 常数项为0;

图论4-Planarity

Planarity

一个平面图(planar)被定义为:在平面上绘制没有交叉的图;

若图$G$不能在平面上绘制或表示,称为非平面图;

若两个图可以在同一个图的边插入一个2度的新顶点来获得,则这两个图是同胚的(homeomorphic);

image-20241113203750619

称图$H$紧缩于(contractible to)$K_{3,3}$或$K_5$, 如果我们将$H$的边收缩能够得到$K_{3,3}$或$K_5$;

Theorem(Kazimierz Kuratowski)

$K_{3,3},K_5$是非平面的;进一步地,如果一个图是平面图,当且仅当其没有子图和$K_{3,3}$或$K_5$同胚;

Corollary

一个图是平面的当且仅当它不包含可紧缩到$K_5$或$K_{3,3}$的子图;

proof:考虑命题反面

image-20241113204645054

Crossing

图$G$的交叉数${\rm cr}(G)$定义为将$G$绘制在平面上是发生的最小交叉数;

显然${\rm cr}(K_5)={\rm cr}(K_{3,3})=1$;

image-20241113205735583

图的厚度$t(G)$定义为将$G$分解成若干个平面图的并的最小数量;

Theorem

对于简单图$G$,顶点数$n\ge 3$,边数$m$; 则厚度存在下界
$$
t(G)\ge \lceil \frac {m}{3n-6} \rceil
$$
proof:只需证$m\le (3n-6)t(G)$;

Bound

定义一个平面图的区域$R$的边界度(bound degree)为$b(R)$ 为遍历区域的边界记录的图的边数;

假设平面图将平面划分为$f$个区域,称$f$为平面图的面数;

Theorem

假设平面图$G$的面最小边界度为$l\ge 2$,则
$$
lf\le C=\sum_{R} b_R\le 2m
$$
对于不少于3个顶点的简单平面图,则
$$
m\le \frac{l}{l-2}(n-2)
$$
对于一般的平面图,自然有
$$
m\le 3n-6
$$
对于二部平面图,有
$$
m\le 2n-4
$$

Theorem(Euler)

若图$G$是一个具有$n$个顶点,$m$条边和$f$个面的连通平面图,则满足一下公式:
$$
n-m+f=2
$$
proof:若图有圈,删除一条圈中的边导致$m$和$f$均减少1,且不丢失连通性;重复上述操作划归为树的情况,即$m=n-1,f=1$
note:由此可证明$K_{3,3},K_5$不是连通图;

Corollary

$K_{m,n}$是平面图当且仅当$\min {m,n}\le 2$;$K_n$是平面图当且仅当$n\le 4$;

Corollary

对于平面图$G$,有
$$
n-m+f=\omega(G)+1
$$

Polyhedra

一个多面体(polyhedron)定义为一个实体,它被有限个面包围,每一个面都是多边形;
一个多面体是凸的,若连接两个顶点的险段都完全包含在多面体内;
多面体可以用一个平面图表示;

一个多面体是正则的(regular),若存在整数$n\ge 3, m\ge 3$,每个顶点均有$r$个面在此相遇,而且每个面的边界上均有$l$条边;

image-20250113201109956image-20250113201118879

Theorem

假定正多面体的顶点度为$r$,每个面度为$l$,则$(l,r)$仅有如下取值:
$$(3,3),(3,4),(4,3),(3,5),(5,3)$$
proof:注意到
$$
n-m+f=2 \
2m=lf=nr
$$

导出
$$
(l-2)(r-2)<4
$$

Fullerene

一个(fullerene)的特征如下:

  • 由五边形和六边形构成;
  • 每个顶点处有3个面相遇;

可以确定,总共12个五边形;

image-20250113201045487proof:注意到
$$
n-m+f=2\
f=f_5+f_6\
2m=3n=5f_5+6f_6
$$

Genus

定义一个表面的亏格数(genus)$g$,如果其拓扑同构于有$g$个(handle)或者交叉帽(cross-caps)一个球体(sphere);

image-20250113201150372

这里给出结论,$K_5$和$K_{3,3}$是亏格数为1的图(toroidal graphs);

image-20250113201837423

Theorem

图$G$的亏格数$g$不超过其交叉数${\rm cr}(G)$;

Theorem

对于可定向的连通图$G$,亏格数为$g$,顶点数为$n$,边数为$m$,面数为$f$,满足
$$
n-m+f=2-2g
$$

Theorem

对于不少于4个顶点的可定向的连通图$G$,边数为$m$,顶点数为$n$,其亏格数满足
$$
g(G)\ge \lceil \frac{m-3n}{6}\rceil +1
$$

图论3:Tree

树&森林

若一个连通图没有圈,称这个图为(Tree);

若一个图没有圈,称这个图为森林(forest);

Theorem

若树$T$至少有$n\ge 2$个点,那么$T$至少包含2个叶子结点;

proof:取最长路的两个端点;

Theorem

对于含有$n$个结点的简单图,以下命题等价:

  1. $T$是一棵树;
  2. $T$有$n-1$条边且没有圈;
  3. $T$有$n-1$条边且连通;
  4. $T$连通,且每条边都是桥;
  5. $T$中任意两个点有且仅有一条路径;
  6. $T$没有圈,但是任意添加一条边恰好形成一个圈;

proof:

$1\Rightarrow 2$:归纳,删去叶子

$2\Rightarrow 3$:归纳,每个连通分量无圈,说明分量是树,统计边发现只有一个连通 分量;

$3\Rightarrow 4$:只需证$n$个点的连通图至少有$n-1$条边,归纳,删叶子即可;

$4\Rightarrow 5$:由连通性至少有一条,若存在两条,则这两条路径上的边不是桥,矛盾;

$5\Rightarrow 6$:若有圈则任意两点至少两条路径,矛盾;加一条边至少形成一个圈,若多余1个,说明原图有圈,矛盾;

$6\Rightarrow 1$:反证,若不连通,每个分量是树,在分量之间添加一条边无法形成圈,矛盾;

Corollary

若图$G$是一个森林,则$|E(G)|=|V(G)|-\omega(G)$

Spanning Tree

图$G$的生成子树(spanning tree)是指图$G$的一个生成子图,这个子图是树;

对于连通图$G$,一定包含一个生成子树;定义陪树(cotree)为$G$中去除$T$得到的图;

对于一个具有$n$个顶点,$m$条边,$k$个连通分量的图$G$,通过删除图$G$中任意一条边,直到没有圈剩下,得到的图是图$G$的一个生成森林;

  • 圈阶$\gamma(G)$:在这个过程删除的边数$\gamma(G)=m-n+k$
  • 键阶$\xi(G)$:最小边割的边数$\xi(G)=n-k$;

对与连通图$G$和其生成子树$T$,

定义子树$T$的键基本集(bond fundamental set):删去子树$T$将图$G$划分为两个顶点集$V_1,V_2$,连接$V_1,V_2$的所有边构成图$G$的键,通过这种方式获得的键的全体构成基本集;

类似定义子树$T$的圈基本集(cycle fundamental set)

Theorem

对于图$G$的任意生成子树$T$,有

  • 图$G$的任意键和$T$至少有一条公共边;
  • 图$G$的任意圈和$T$的陪树至少有一条公共边;

proof:取$C^$是图$G$的键,删去$C^$将图$G$分成两部分,$T$一定有边连接这两部分,这条边一定属于键;若圈和陪树没有公共边,那么圈一定包含在$T$中,矛盾;

Prufer序列

给定由$n$个数构成的集合$S$,记$T$是定义在$S$上的一棵树;

定义$T$的Prufer编码$f(T)$,$f(T)$是长度为$n-2$的序列,显然$f(T)\in S^{n-2}$;

编码算法如下:

  1. 维护$T$的叶子集合$L$;
  2. 在第$i$步,找到$L$中标号最小的叶子$b_i$, 令$a_i$是叶子的父亲;
  3. 更新$L\leftarrow L-b_i, f(T)\leftarrow f(T)+a_i$;若$a_i$因为删去$b_i$成为叶子,$L\leftarrow L+a_i$
  4. 直到只剩下一条边,停止;

解码算法如下:

  1. 维护未加标记点集$V$和未使用的编码点集$F$,初始化$V:=S,F:=f(T)$,初始化图$T$为$n$个孤立点
  2. 准备第$i$步,取出$f_i(T)$,此时$|V|=n-i+1,|F|=n-i-1$,$V$中至少有2个点不会出现在$F$中,即$|V-F|\ge 2$;
  3. 取$x$为$V-F$中标号最小的顶点,添加$xf_i(T)$到$T$,标记$x$,$F\leftarrow F-f_i(T)$(即从$i+1$位开始,指针右移);
  4. 重复2,3一共$n-2$次,剩下两个未标记的顶点,连边并加入$T$;

举例:以下树的Prufer编码为[6,5,6,5,1],发现编码删边的顺序和解码加边的顺序相同;

image-20241110170746044

Theorem(Caylay)

对于$n$个顶点,一共有$n^{n-2}$个不同的标号树;

proof:只需要证明树$T$作Prufer编码和解码,依然得到树$T$,完成双射,归纳即可(删去第一个叶子后采用归纳假设);

Corollary

$K_n$有$n^{n-2}$个生成子树;

矩阵树

定义连通图$G$,定义其生成子树的数量为$\tau(G)$;记其Laplacian矩阵为$L=(l_{ij})$;

对于图$G$和其中一条边$e$,定义其缩边$G\cdot e$为合并$e$的两个顶点为一个顶点,原来和两个顶点关联的边都和新顶点相关联;

Theorem

若$e\in E(G)$且不是自环,则
$$
\tau(G)=\tau(G-e)+\tau(G\cdot e)
$$
为此只需证明$G\cdot e$的生成树和$G$中包含$e$的生成树之间可建立双射即可;

image-20241110173825906

Theorem

假设$L^$是从$L$中删除$s$行$t$列得到的矩阵,则生成树的数目等于$L$的任何余子式的值;
$$
\tau(G)=(-1)^{s+t}\det L^

$$
proof:为此只需证明$s=t$的情况

树中的最优化问题

The Connector Problem

将建立连接多个城镇的铁路网。考虑到在城镇$v_i$和$v_j$之间建造直接连接的成本$c_{ij}$,设计这样的网络以最大限度地降低建设总成本;

这个问题可进一步形式化描述如下:

给定一个连通加权图$G$,如果$T$的边权之和不超过$G$的任何其他生成树之和,则生成树$T$称为最小权重生成树,现需要找到图$G$的最小生成子树权和;

Kruskal算法

Kruskal算法用于解决一类稀疏带权图的最小生成树问题,这是一类基于添加当前最优边的贪心策略;

  1. 初始化$E(T)=\varnothing,V(T)=V(G)$,对边权值排序;
  2. 若下一条权值最小的边$e$将$T$的两个分量连接起来,则$E(T)\leftarrow E(T)+e$,否则丢弃它;
  3. 迭代总共$V(G)-1$步加边操作,此时$T$变得连通;

image-20241110174953351

Kruskal算法最优性证明:

假设Kruskal生成树$T$,其一定不包含圈,否则一定存在某次加边操作,没有连接两个分量而是在某一个分量内部连接;

假设最小代价树$T^\neq T$,边排序后,考虑它们不相同的第一条边$e$;$T^+e$将产生圈$C$,取$e^\in C-T$,那么$T+e-e^$是比$T^*$更小代价的生成树,矛盾;

数据结构实现:

顺序迭代边可采用优先队列(堆);

为每个顶点$v$记录包含$v$的连通分量标号$c(v)$,初始为其序号;

对于选用某条边$uv$时,应该有$c(u)\neq c(v)$,否则被弃用;

添加边后,应该更新$c(u)=c(v)\leftarrow\min(c(u),c(v))$;

时间复杂度应为$O(|V|log|M|)$;

或是维护边的并查集

Prim算法

Prim算法用于一类稠密带权图的最小生成树问题,这时一类逐步归并顶点的策略;

  1. 任意选择树的根节点$r$,初始化已包含顶点集$S={r}$,树$T:V(T)=V(G),E(T)=\varnothing$;
  2. 选择连接$S$和$V(G)-S$中的边权值最小者$uv,u\in S,v\in V(G)-S$,更新$S\leftarrow S+v,E(T)\leftarrow E(T)+uv$;
  3. 重复添加顶点,直到$S=V(G)$;

Prim算法最优性证明:

假设Prim生成树$T$,其一定不包含圈,因为每次加边操作都是在不相交的集合中选择的;

假设最小代价树$T^\neq T$,边排序后,考虑它们不相同的第一条边$e\in T$;取$e^\in T^$,由$T^$的最小性,$\omega(e^)< \omega(e)$,由算法最小性$\omega(e)\le \omega(e^)$;

数据结构实现:

存取图使用邻接表,采用斐波那契堆优化,可达到$O(|E|+|V|log|V|)$;

图论-Path and Cycle

Walk/Trail/Path/Circle

在图$G$中,途径(Walk)是指如下形式的 边序列
$$
v_0v_1,v_1v_2,…,v_{n-1}v_n:=e_1,e_2,…,e_n
$$

  • 边的数量$n$是迹的长度
  • 简单图可以表示为$v_0 → v_1 → v_2 → · · · → v_n$
  • 起始点initial vertex:$v_0$
  • 终点final vertex:$v_n$
  • 内部点internal ertex:$v_1,v_2,…,v_{n-1}$

特别地,我们称边集相异的途径称为 (trail)

我们称顶点集相异的迹称为(path)

  • 所有的点为$v_0,v_1,…v_n$,可能存在$v_n=v_0$
  • 记作$P_{n+1}$

对于顶点和终点相同的路称作(circle);

  • 所有的点为$v_0,v_1,…v_n$,$v_n=v_0$
  • 记作$C_n$
  • 长度为3的圈记作三角形(triangle)

Theorem

对于顶点集为$V={v_1,v_2,…,v_n}$和邻接矩阵$A=[a_{ij}]$,邻接矩阵的幂
$$
A^k = [a_{ij}^{(k)}]
$$
表示$v_i-v_j$间长度为$k$的迹的数目;

proof :归纳法

Theorem

对于所有点度数至少为2的图,必定包含一个圈;

proof:考虑最长路;

Lemma

对于简单图$G$,$\delta(G)\ge k$,那么$G$包含一条长度至少为$k$的路;

连通图

称图$G$是连通的(connected),当且仅当对于点集中任意点对$x,y$,存在$x$到$y$的路;

连通分量的数目记作$\omega(G)$;

Theorem

对于具有$n$个顶点的简单图$G$ ,其有$k$个连通分量,边的数目满足以下不等式约束:
$$
n-k\le m\le \frac{(n-k+1)(n-k)}{2}
$$

proof: 下界显然,上界只需注意以下引理
$$
\binom{p+q-1}{2}=\binom{p}{2}+\binom{q}{2}+(p-1)(q-1)\ge \binom{p}{2}+\binom{q}{2}
$$

Corollary

任意具有$n$个顶点的简单图,若其边数大于$(n-1)(n-2)/2$, 则一定是连通的;
proof:这意味着连通分量个数小于2;

Distance

对于图上两点$u,v$

  • 距离$d(u,v)$:从$u$到$v$的最短路的长度;
  • 离心距$\varepsilon(x)$:对于点$x$,遍历可能的顶点$y$,使得$d(x,y)$最大化的距离值;
  • 图的直径$D(G)$:使得$\varepsilon(x)$最大化的离心率值;
  • 图的半径$R(G)$:使得$\varepsilon(x)$最小化的离心率值;
  • 图的围长$g(G)$:图$G$的最短圈的长度;
  • 图的周长$c(G)$:图$G$的最长圈的长度;

Theorem(Konig)

图$G$是二部图当且仅当图中不含有奇圈;
proof: 反证法;

Edge-Connectivity

断集(disconnecting set)是指对于连通图上的一组边,满足其消失导致图变得不连通;

对于$S,T\subseteq V(G)$,,如果两个点集之间的边,其顶点各在不同的两个点集之中,记作$[S,T]$;

边割(edge cut)就是指这样一种$[S,\overline S]$;这样的边割定义蕴含着某种对称差性质,记作$\partial(S)$;

称图的最小非空边割为(bond);

若一个边割只包含一条边,我们称这条边为割边(cut edge)/(bridge);

image-20250113175050077

对于连通图$G$,其边连通性(edge connectivity)定义为最小边割的大小,也就是我们使图$G$不连通所需要删除的最少边数,记作$\lambda(G)$;
换句话说,若$\lambda(G)=k$,称$G$是$k-$边连通的,但不是$(k+1)-$边连通的;

note:边连通性描述了图到底有多么连通的性质,删除多少条边才能使得图变得不连通,暗示着图两点之间的独立路径数;

Lemma

对于图$G$上的顶点子集$S$,满足
$$
|[S,\overline S]|= \sum_{v\in S}d(v)-2|E(G[S])|
$$
proof:统计贡献;

Corollary

图$G$是偶图(每个顶点的度为偶数),当且仅当对于任意的非空顶点子集$S$,$[S,\overline S]$ 为偶图;
proof:充分性显然,必要性只需要取一个顶点构成的点集即可;

Lemma

对于图$G$,其点集的子集$X,Y$,有
$$
\partial(X) \triangle \partial(Y)=\partial(X\triangle Y)
$$
proof:如下图
image-20241104183459892

Theorem

对于连通图$G$,一个边割$F$是键当且仅当$G-F$恰好有两个$2$个连通分量;一个边集$S$是边割的充分必要条件是$S$是若干键的不相交并;
proof:利用键的最小性即可;

Lemma

对于图$G$,一条边$e$是桥当且仅当$e$不在图$G$的圈中;
proof:反证法;

Vertex-Connectivity

对于连通图$G$,称一组顶点为点割(vertex cut),如果删除这组顶点会导致图$G$不连通;若点割只包含一个顶点,则称这个点为割点(cut vertex);

类似定义点连通性为点割的最小大小,记作$\kappa(G)$,也就是使得图$G$不连通的最少删除点数
若$\kappa(G)=k$,称作图$G$是$k-$点连通的,但不是$(k+1)-$点连通的;

Theorem

对于简单图,有$\kappa(G)\le \lambda(G)\le \delta(G)$;
proof:考虑度最小的点,尝试删除与其关联的边,有$\lambda(G)\le \delta(G)$;
取一组最小的边割$[S,\overline S]$,完全图的情况平凡,考虑非完全图,取出$x\in S,y\in\overline S, x\nleftrightarrow y$;
构造
$$
T={u|u\in \overline S, x\leftrightarrow u}\bigcup {v|v\in S,y\leftrightarrow v}
$$
这是一组点割,容易观察到$\kappa(G)\le |T|\le \lambda(G)$;
image-20241104183524845

2-连通图

称两条路内部不相交(internally disjoint),如果他们没有共同的内部顶点;

2-连通图意味着它既是2-边连通的,也是2-点连通的;

Theorem

对一个至少有3个顶点的图$G$,若$G$是2-连通的,当且仅当对于每一个点对$u,v\in V(G)$,均存在两条内部不相交的路将他们相连;

proof:充分性:删去一条边/点仍有另一条路径将之连通;

必要性:对距离归纳,相邻情况平凡;考虑最短路径前面一个点,构造不相交路径,删去该点仍然存在一条路径将之连通,如下图,选择最后一次与先前构造的两条路径交汇的顶点即可;

image-20250113183629667

Theorem(Menger,vertex version)

拥有至少$k+1$条路经的图$G$是$k$-点连通的当且仅当对于每一个点对$u,v$存在$k$条内部无公共点的路径;

Theorem(Menger,edge version)

图$G$是$k$-边连通的当且仅当对于每一个点对$u,v$存在$k$条内部无公共边的路径;

Eulerian Graph

欧拉迹(Eulerian trail)定义为包含图中所有边的迹;若这个迹闭合,称为欧拉圈(Eulerian circuit);
若图包含一个欧拉圈,称该图为欧拉图(Eulerian graph);若图不包含欧拉圈,但是包括一个欧拉迹,称该图为半欧拉图(semi Eulerian graph);

Lemma

若图$G$是图,每个顶点的度至少为2,那么图$G$包含圈;
proof:对于非简单图,结论平凡,对于简单图,考虑最长路即可;

Theorem

若连通图$G$是欧拉图当且仅当每个顶点的度数为偶数;
proof:配对;

Theorem

若连通图$G$是半欧拉图,当且仅当恰好存在两个顶点的度数为奇数;
proof:除开迹首尾两个顶点外配对,迹首尾两个顶点为奇点;

Fleury Algorithm

构造欧拉圈可按照如下算法:

  1. 从一个顶点$u$开始,选择与之关联的,未被遍历的一条边;
  2. 若选择的边是桥,改选其他边,若没有别的选择,就选择桥;选择这条边的另一个顶点为$v$;
  3. 将这条边加入迹中,擦除这条边
  4. 若产生了新的孤立点,同时擦除这个孤立点;
  5. 将$u$更新为$v$,选择下一条边;

Hamilton Graph

一个哈密顿圈是指一个遍历图中所有顶点的圈;
一个图$G$为哈密顿图当且仅当图$G$包含一个哈密顿圈;

  • 对于$n\ge 3$,$K_n$是哈密顿图
  • 当且仅当$m=n\ge 2$时,$K_{m,n}$是哈密顿圈
  • Peterson图不是哈密顿图

由此定义图$G$的哈密顿闭包$C(G)$:通过在不相邻的点对上增加边,达到不存在不相邻的点对使得$d(u)+d(v)\ge n$的状态,也就是无法继续加边;这样的加边是顺序无关的;

image-20241105150112268

Theorem

若$G,H$均是哈密顿图,那么$G \square H$是哈密顿图;
proof:对于$p$为偶数,构造如下:

image-20241105145856010

对于$p$为奇数,构造如下:

image-20241105145925675

Theorem

对于哈密顿图$G$,取顶点集的非空真子集$S$,有
$$
\omega(G-S)\le |S|
$$

proof:取$G$的哈密顿圈$C$,$C-S$至多$|S|$个分量;意味着$G-S$至多$|S|$个分量;

Theorem(Erdos)

对于具有$n$个顶点的简单图$G$,若$\delta(G)\ge \frac n2$,则图$G$是哈密顿圈;
proof:反证法,增加边使得$G$成为没有哈密顿圈的最大图,取图$G$中的最长路$v_1v_2…v_n$;由假设$v_n\nleftrightarrow v_1$
注意到
$$
S={j|v_1\leftrightarrow v_j}\

T={j|v_{j+1}\leftrightarrow v_n}\

|S\cap T|=|S|+|T|-|S\cup T|\ge \frac n2+\frac n2 - (n-1)=1
$$
image-20241105150019504
则存在哈密顿圈$v_1\to v_2\to\cdots\to v_j\to v_{j+1}\to\cdots \to v_n$;
注:可进一步加强为$d(u)+d(v)$对任意不相邻的点对成立,这说明在简单图上哈密顿闭包是良定义的;

Lemma(Bondy)

对于简单图$G$,$G$是哈密顿图当且仅当$G$的闭包是哈密顿图;

Theorem(Chvatal)

对于简单图$G$的度序列为$d_1\le d_2\le …\le d_n,n\ge 3$,$\forall i<\frac n2, d_i>i\vee d_{n-i}\ge n-i$,则图G是哈密顿图;

Theorem(Chvatal-Erdos)

若$\kappa(G)\ge \alpha(G)$,则$G$是哈密顿图,除非$G=K_2$

Claw-free Graph

称图$G$是**无爪的(**claw-free),当且仅当其不含$K_{1,3}$

在无爪图中,任何顶点的邻居的生成子图只有两种类型,从而将顶点分为两类:

  • Type1:连通图
  • Type2:仅有两个连通分量,并且分量都是完全图;

对于Type1的顶点,定义操作:在邻居中添加原本没有的边;只要邻居不构成团,操作就可以进行;

定义Ryjáček闭包:对于无爪图$G$,反复应用上述操作使得每一个Type1顶点邻居都能导出团,增边结束后生成图$H$;

Theorem

$H$是哈密顿的当且仅当$G$是哈密顿的;

Theorem

设$G$是2-连通图,顶点数$n>2$,$u$和$v$是$G$的不同点。若
$$
d(u,v)=2\Rightarrow \max{d(u),d(v)}\ge \frac n2
$$
则$G$具有哈密顿圈。

Shortest Path Problem

Gravity法

Making a model of the map by knotting together pieces of string whose lengths are proportional a length of the roads. To find the shortest length, take hold of the knots corresponding to A to L–and pull tight !

Dijkstra算法

The idea is to move across the graph from left to right, associating with each vertex X a number l(X) indicating the shortest distance from A to X. This means that, when we reach a vertex such as Kin the figure, then l(K) is either l(H) + 6 or l(I) + 2, whichever is smaller.

Chinese Postmen Problem

邮递员希望投递信件,尽可能短的总距离并回到他的起点。显然,他必须至少穿过路线中的每条道路一次。

image-20241105161909715

在一个具有非负权的带权连通图$G$中,找出一条总权重最小的环游,这种环游称为最优环游。

若$G$为欧拉图,任意欧拉圈都是最优环游;

考虑$G$为非欧拉图,其必然包含偶数个奇度顶点;并且, 对于任意一个环游必定通过某些边不止一次,选取重复边按相同权值加入图$G$中,问题等价描述为一个最优化问题:

添加重复边求一个欧拉赋权母图$G^=G+E_1,E_1\in E(G)$,最小化
$$
\sum_{e\in E(G^
)-E(G)} \omega(e)
$$
同时找到$G^*$的欧拉圈;

Theorem

上述欧拉赋权母图拥有最小权值的欧拉圈当且仅当

  • $G$的每一条边至多被添加一次
  • 对于$G^*$的每一个圈$C$,均有$\sum_{e\in E_1\cap E(C)}\omega(e)\le \sum_{e\in E(C)-E_1}\omega(e)$

Ttravelling Saleman Problem

一位旅行推销员希望参观一些城镇,然后返回他的家。鉴于城镇之间的距离,他应该如何规划路线,以便他只访问每个城镇一次,并最大限度地减少总旅行距离?

该问题可形式化描述为最小化带权完全图的哈密顿圈权值,称问题的解为TSP环游;

这是一个NP-hard问题;

Aheuristicapproach:2-edge-exchange: 如果一个可以通过删除两条边并添加两条边从另一个获得,则两个TPS路径称为2-相邻;

image-20241105165412898

通过上述边的对换, 我们可以迭代地挖掘出最优路径;

Golang中的并发机制

Golang的并发处理优势

并发处理是Golang设计的核心目标之一,其通过一条简单的关键字go来启动协程goroutine,在广义上我们可以将协程理解为线程;

由于Golang轻量级的特性,在一个主程序中可是轻而易举地列举上千条协程,线程安全只需要由通道(chan)数据类型实现,而且先天支持多核CPU的调度;

多核CPU并发分担

所谓main()运行在程序的主线程中,当main()退出时,所有的goroutine都将退出,即便这些协程没有完成它的任务;

因此我们在接下来的示例程序中将引入100ms的睡眠无限循环防止程序提前退出,以便其他协程有机会运行,同时避免主协程无效忙等;

请注意,协程的执行是异步的,主协程不会等待协程,而是直接跳过协程,这就是在协程上打断点无效的原因;

在Goalng中查看实际硬件CPU数:

1
cpuCores := runtime.NumCPU()

将可用CPU核数设为n,对于n<1,配置为默认的机器配置;

1
runtime.GOMAXPROCS(n)

测试起见我们将CPU数设为2,因为可能配置太高看不出来共享冲突;

共享冲突

执行以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import (
"fmt"
"runtime"
)

var valueG int = 0
var stop1 bool = false
var stop2 bool = false

func routine1(countA int, stopA *bool) {
for i := 0; i < countA; i++ {
valueG = valueG + 2
}
*stopA = true
}

func main() {
runtime.GOMAXPROCS(2)
go routine1(100000000, &stop1)
go routine1(100000000, &stop2)
for {
if stop1 && stop2 {
break
}
}
fmt.Printf("valueG: %v\n", valueG)
}

执行结果如下:

image-20240919015923605

很明显,临界资源的访问没有互斥机制,所以执行的结果也有不同;

我们加上控制机制来保证同一时刻只能由一个任务来访问该数据

共享安全

共享安全:保证在多任务并发处理时共享数据不会因共享冲突而导致错误;

Golang就提供了这样的数据类型来保证共享安全机制:chan管道, 这是一个先入先出的队列

执行以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main

import (
"fmt"
"runtime"
)

var valueG chan int
var stop1 bool = false
var stop2 bool = false

func routine1(countA int, stopA *bool) {
for i := 0; i < countA; i++ {
tmpC := <-valueG
valueG <- (tmpC + 2)
}
*stopA = true
}
func main() {
runtime.GOMAXPROCS(2)
valueG = make(chan int, 1)
defer close(valueG)

go routine1(10000, &stop1)
go routine1(10000, &stop2)
valueG <- 0

for {
if stop1 && stop2 {
break
}
}
fmt.Printf("valueG: %v\n", <-valueG)
}

执行结果如下,可以看到确实输出结果保持了一致:

image-20240919020628894

注意:

  • 理解-><-操作符是阻塞的:
    • 当从通道接收数据时,如果通道中没有数据,接收操作会阻塞,直到有数据可接收;
    • 当向通道发送数据时,如果通道没有接收方,发送操作会阻塞,直到有协程准备接收数据;
    • 这种阻塞行为可以确保并发协程之间的通信是同步的,避免了数据的丢失或竞态条件

获取令牌的任务

对于一些任务,取到令牌的任务才能访问某些数据,访问完毕之后交回令牌供其他任务使用;

以下是示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package main

import (
"fmt"
"runtime"
)

var valueG int
var stop1 bool = false
var stop2 bool = false

var token chan bool

func routine1(countA int, stopA *bool) {
for i := 0; i < countA; i++ {
<-token // 关键
valueG = valueG +2
token <- false
}
*stopA = true
}
func main() {
runtime.GOMAXPROCS(2)
token = make(chan bool, 1)
defer close(token)

go routine1(10000, &stop1)
go routine1(10000, &stop2)

token <- false
for {
if stop1 && stop2 {
break
}
}
fmt.Printf("valueG: %v\n", valueG)
}

在实际应用中,令牌的或许就像这个token一样,等待管道输入过后,任务完成后交回token给下一个任务使用;

多任务归并

并发编程中,主任务将任务拆分成子任务并等待所有子任务完成之后再进行下一步处理的过程称作多任务的归并;

这样做可以充分利用CPU性能,避免资源的过渡浪费;

观察以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package main

import (
"fmt"
"runtime"
)
var goroutineCount = runtime.GOMAXPROCS(0) // 默认CPU核数
var resultBuffer chan float64

func addRoutine(lenT int){
var sumT float64
for i := 0; i < lenT; i++ {
sumT += 1.0
}
resultBuffer <- sumT
}

func addByGoroutine(countA int) float64 {
sumT := 0.0
lenT := countA / goroutineCount
leftT := countA - lenT*goroutineCount
go addRoutine(lenT + leftT)
for i := 1; i < goroutineCount; i++ {
go addRoutine(lenT)
}
for i := 0; i < goroutineCount; i++ {
sumT += <-resultBuffer
}
return sumT
}

func main(){
resultBuffer = make(chan float64, 1)
defer close(resultBuffer)

res := addByGoroutine(1000000)
fmt.Print(res)
}

超时终止机制

利用select监听多个通道,我们可以轻松实现超时终止机制:

1
2
3
4
5
6
7
8
select {
case tmpF = <-resultBuffer1:
sumT1 += tmpF // 任务1
case tmpC = <-resultBuffer2:
sumT2 += tmpC // 任务2
case <-time.After(3 * time.Second):
timeoutFlag = true // 超时
}

注意:time.After将返回一个定时触发的chan类型值

我们可以如下自定义超时函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 休眠指定的秒数后,向通道中写入一个数值表示超时(数值本身不重要)
// chanA是只能写入的单向通道
func realTimeout1(secondsA time.Duration, chanA chan<- bool) {
time.Sleep(secondsA * time.Second)
chanA <- true
}
// 仅用于新建一个通道后启动真正的超时routine,并将该通道返回让select等待通道中有值
func timeout1(secondsA time.Duration) <-chan bool {
chan1 := make(chan bool, 1)
// 传入realTimeout1的chan1被强制转换为只写通道类型
go realTimeout1(secondsA, (chan<- bool)(chan1))
return (<-chan bool)(chan1) // 返回时将chan1强制转换为只读通道类型
}

sync实现并发处理

我们可以利用sync.WaitGroup来实现多任务的归并,初始化sync.WaitGroup,每进行完一个任务计数器减1;

观察如下代码,执行发现每次结果有所不同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package main

import (
"fmt"
"sync"
)

var groupG sync.WaitGroup
var times = 100000
var valueG = 0

func addRoutine(countA int) {
defer groupG.Done()
for i := 0; i < countA; i++ {
valueG = valueG + 2
}
}
func minusRoutine(countA int) {
defer groupG.Done()
for i := 0; i < countA; i++ {
valueG = valueG - 1
}
}

func main(){
groupG.Add(2)
go addRoutine(times)
fmt.Printf("add value: %d\n", valueG)

go minusRoutine(times)
fmt.Printf("minus value: %d\n", valueG)

groupG.Wait()

fmt.Printf("Final value: %d\n", valueG)
}

这是因为触发了竞态条件:valueG = valueG + 2valueG = valueG - 1 这些操作并不是原子操作,包含多个步骤:读取 valueG 的值,进行计算,然后将结果写回 valueG

在并发环境中,这些步骤可能会被其他 Goroutine 打断,导致结果不一致;

正确的做法是为addminus加锁:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package main

import (
"fmt"
"sync"
)

var groupG sync.WaitGroup
var mutexG sync.Mutex

var times = 100000
var valueG = 0

func addRoutine(countA int) {
defer groupG.Done()
for i := 0; i < countA; i++ {
mutexG.Lock()
valueG = valueG + 2
mutexG.Unlock()
}
}
func minusRoutine(countA int) {
defer groupG.Done()
for i := 0; i < countA; i++ {
mutexG.Lock()
valueG = valueG - 1
mutexG.Unlock()
}
}

func main(){
groupG.Add(2)
go addRoutine(times)
fmt.Printf("add value: %d\n", valueG)

go minusRoutine(times)
fmt.Printf("minus value: %d\n", valueG)

groupG.Wait()

fmt.Printf("Final value: %d\n", valueG)
}

协程和进程的区别

  1. 一个线程可以有多个协程。
  2. 大多数业务场景下,线程进程可以看做是同步机制,而协程则是异步。
  3. 线程是抢占式,而协程是非抢占式的,所以需要用户代码释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。
  4. 协程并不是取代线程,而且抽象于线程之上。线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行。

Go 开发

第一章 GO_Enviroment

1.1 Go 命令

  • go biuld

    如果是普通包,它不会产生任何文件。如果是 main 包.它就会在当前目录下生成一个可执行文件。也可以指定编译输出的文件名。如果你的源代码针对不同的操作系统需要不同的处理,那么你可以根据不同的操作

系统后缀来命名文件.

  • go clean

    移除当前源码包里面编译生成的文件.

  • go fmt

    gofmt -w src,可以格式化整个项目。

  • go get

    动态获取远程代码包的

  • go install

    在内部实际上分成了两步操作:第一步是生成结果文件(可执行文件或者.a 包),

第二步会把编译好的结果移到$GOPATH/pkg 或者$GOPATH/bin;

  • go test

    会自动读取源码目录下面名为*_test.go 的文件,生成并运行测试用的可执

行文件。

  • go doc

    go doc builtin

    go doc net/http

    godoc -src fmt Printf

第三章 Goweb

  • 浏览器本身是一个客户端,当你输入 URL 的
    时候,首先浏览器会去请求 DNS 服务器,通过 DNS 获取相应的域名对应的 IP,然后通过
    IP 地址找到 IP 对应的服务器后,要求建立 TCP 连接,等浏览器发送完 HTTP Request
    (请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调用自身服务,返回
    HTTP Response(响应)包;客户端收到来自服务器的响应后开始渲染这个 Response 包
    里的主体(body),等收到全部的内容随后断开与该服务器之间的 TCP 连接。

集合基础

集合(set)由指定范围内的某些特定对象聚集在一起构成;

指定范围内的每一个对象称为这个集合的元素(element)。

通常用大写字母表示集合,用小写字母表示元素;

集合的三大特征:互异性,确定性,无序性;

描述集合的方法:

  • 枚举法:$A={a,b,c,d}$
  • 隐式法(叙述法):$P={x|P(x)}$
  • 归纳法 : 基础+归纳+极小性(指出集合的界限);
  • 递归指定:通过计算规则定义集合中的元素
  • 文氏图:一般用平面上的圆形或方形表示一个集合,而集合中的元素用小圆点来表示。

集合和元素的关系

  • $a$属于集合$A$,记为$a\in A$;
  • $a$不属于集合$A$,记为$a\in A$;

不含任何元素的集合称作空集,记作$\varnothing$​;

外延性原理:$A=B$当且仅当$A$与$B$具有相同的元素,否则,$A\neq B$​。

集合和集合的关系:

  • 包含关系$B\subseteq A$:$B\subseteq A$对任意$x$,如$x\in B$,则$x\in A$;
  • 相等:$B\subseteq A, B\subseteq A \iff A=B$
  • 真包含关系$B\subset A$:对任意$x$,如$x\in B$,则$x\in A$,并且,$\exist y\in A$,但是$y\notin B$

空集是一切集合的子集,是绝对唯一的;

全集是指在一个相对固定的范围内,包含此范围内所有元素的集合,是相对唯一的,

基数:集合$A$中元素的数目称为集合$A$的基数(base number),记为$|A|$​;

根据基数是否有限可以将集合分为有限集和无限集;

把$A$的所有不同子集构成的集合叫做$A$的幂集(power set),记为$P(A)$或$2^A$;其符号化表示为
$$
P(A)={x|x\subset A}
$$
设$A,B$是两个集合,若在$A,B$之间存在一一映射的关系:
$$
ψ:A→B
$$
则称$A$与$B$是等势的(equipotential),记为:$A\sim B$

凡是与自然数集合等势的集合,统称为可数集合,基数记作$\aleph_0$;

  • 有理数集合必是可数集合;
  • 两个有限集合等势当且仅当它们有相同的元素个数;
  • 有限集合不和其任何真子集等势;
  • 可数集合可以和其可数的真子集等势。

开区间$(0,1)$称为不可数集合,基数记作$\aleph$​;

  • 凡是与开区间(0,1)等势的集合都是不可数集合;
  • $\R$是一个不可数集合

集合恒等式

  1. 等幂律:$A∪A=A;A∩A=A$;

  2. 交换律:$A∪A=A∪A;A∩A=A∩A$

  3. 结合律:$A∪(B∪C)=(A∪B)∪C; A∩(B∩C)=(A∩B)∩C$;

  4. 恒等律:$A∪\varnothing =A; A∩U=A$;

  5. 零律:$A∪U=U; A∩\varnothing=\varnothing$;

  6. 分配律:$A∩(B∪C)=(A∩B)∪(A∩C), A∪(B∩C)=(A∪B)∩(A∪C)$

  7. 吸收律:$A∩(A∪B)=A, A∪(A∩B)=A$;

  8. $A - A = Φ$;

  9. $A - B = A - (A∩B)$;

  10. $(A - B) - C = A - (B∪C)$;

  11. $A∪(B-A) = A∪B$;

  12. $A - B =A∩\overline{B}$ ;

  13. 否定律:$\overline {\overline A} = A$ ;

  14. DeMorgan律:$\overline{A \cup B}=\overline A \cap \overline B, \overline{A \cap B}=\overline A \cup \overline B$;

  15. 矛盾律: $A∩\overline{A}=\varnothing$;

  16. 排中律:$A∪ \overline{A} =U$。

0%