欧拉路径

Basic

1. 定义

图中经过所有边恰好一次的路径叫欧拉路径(也就是一笔画)。如果此路径的起点和终点相同,则称其为一条欧拉回路。

一个重要的性质是:路径写成点的序列形式,除了起点和终点外,每个点每次出现,则其与其前和其后出现的点恰好形成该点的一条入边与一条出边。

2. 欧拉路径判定(是否存在):

定义有向图 \(G=(V,E)\) 中,入度 \(in_v=|\{u|(u,v)\in E\}|\),出度 \(out_u=|\{v|(u,v)\in E\}|\),由于边不会重复出现,因此由上述显然得到:

  • 有向图 \(G\) 存在以 \(u\) 为起点的欧拉回路,当且仅当图至多有一个连通块 \(G'=(V',E')\) 内有边,且 \(\forall x\in V',in_x=out_x\) 。即所有点的入度等于出度。

  • 有向图 \(G\) 存在以 \(u\) 为起点,另一点 \(v\) 为终点的欧拉路径,当且仅当图至多有一个连通块 \(G'=(V',E')\) 内有边,且 \(\forall x\in V'-\{u,v\},in_x=out_x\),即除了起点与终点外,所有点的入度等于出度;且 \(in_u=out_u-1,in_v=out_v+1\)

注意,这里有向图的连通为弱连通,即无需保证任意两点互相可达(但对于欧拉回路,入度等于出度已经保证这一性质)。

定义无向图 \(G=(V,E)\) 中,度数 \(deg_v=|\{u|(u,v)\in E\}|\),同理:

  • 无向图 \(G\) 存在以 \(u\) 为起点的欧拉回路,当且仅当图至多有一个连通块 \(G'=(V',E')\) 内有边,且 \(\forall x\in V',deg_x\) 为偶数 。

  • 无向图 \(G\) 存在以 \(u\) 为起点,另一点 \(v\) 为终点的欧拉路径,当且仅当至多有一个连通块 \(G'=(V',E')\) 内有边,且 \(\forall x\in V'-\{u,v\},deg_x\) 为偶数(以下定义这类点为偶点),且 \(deg_u,deg_v\) 均为奇数(以下定义这类点为奇点)。

定义存在欧拉回路的图为欧拉图。

通常而言,我们所考虑的图都是连通的。但是少数题目可能故意不保证图连通,需要额外判定。

3. 寻找欧拉路径

同样根据基本性质,考虑一个节点若在遍历序列中出现 \(2\) 次,很显然相邻的两次出现间的路径一定为简单环。以此为基础,可以考虑预先找到一条给定起点、终点的路径,然后不断在已包含在路径中的点上找到一条出边、一条入边,并增加一个环来扩大路径。容易发现有解情形下,这样即可保证最终求出完整路径。

根据每条边每次进入都会有一条出边可以离开,容易证明这样必然能够在走若干个简单环后回到原先开始 DFS 的点。

显然最终,我们会将包含开始 DFS 的点的所有环遍历完毕,随后函数将会回溯,进而从其余点开始找环。现在考虑最终的方案,断言:依次出栈形成的序列(即回溯顺序的逆序)就是所找到的一个方案。

考虑对于欧拉回路,显然这样输出实际上即为遍历顺序,并且每次回溯前一定已经将该点可达的所有环全部走过;但对于欧拉路径,遍历过程中可能会在走一部分环后走到终点并且无法继续,此时会出现回溯并重新遍历路径上尚未遍历的环,也就是方案不能仅仅按照遍历顺序。因此这时按照上述输出,就相当于首先保证遍历所有环然后再考虑剩余的路径,从而保证了正确性。

实际实现时,利用一种套路的优化技巧,即使用链式前向星 / 邻接表存图,直接修改 \(head_x\) (或采用 vector 加维护指针)来保证不重复考虑已经走过的边。时间复杂度 \(O(n+m)\),注意搜索深度可以达到 \(m\) 的级别,需考虑栈空间。因此也可以用两个栈自行模拟遍历过程。

求解

1. Luogu P7771 【模版】欧拉路径

此题还要求字典序最小。考察我们按照回溯顺序输出的情形,很显然相当于每次递归时优先走编号较小的点,把每个点的出边按目标点排序即可。对于非回路的情况,由于到终点的非环路径始终在最后,因此和回路情况的做法相同。

2. Luogu P3443 [POI2006]LIS-The Postman

简要:给定一有向强连通简单图,求一条以 \(1\) 为起点的欧拉回路,并且满足给定 \(k\) 个点的序列都连续地出现在该回路上。

例如,对于要求的序列 1 2 34 2 51 2 3 4 2 5 1 是满足条件的欧拉回路。

由于欧拉回路中,任何边仅仅经过一次,因此考虑如果将序列 1 2 3 对应的边 \((1,2),(2,3)\) 删除并改为边 \((1,3)\),这将不会对其它部分的求解产生任何影响。而如果出现给出的序列中有边相交,同样我们也必须将它们合并为一个序列并进而合并为一条边,才能保证相交的边只被走一次。

于是我们对给出序列的每条边维护其在序列中的后继和前驱。则如果一条边发现多个不同的后继或前驱显然无解;若不存在这种情况,那么将所有有后继的边向后合并即可。

合并过程中,可能发现合并出一个环。那么这时候如果环上一条边出现两次显然无解。

否则在合并后的图上跑欧拉回路即可。根据欧拉回路的判定,需要检查 \(1\) 是否位于一个包含图中所有边且(弱)连通的连通块,以及判断入度、出度。


建模

1. Luogu P1341 无序字母对

包括基环树,二分图,欧拉回路,费用流在内的很多图论思想在图论建模题目中常见。这类题目往往需要明确图中点和边的定义与确定方式。

简要:给定 \(n\) 个各不相同的无序字母二元组(区分大小写)。请构造一个有 \((n+1)\) 个字母的字符串使得对于每个二元组中的两个字母,都相邻地出现在字符串中至少一次。

显然以字母为点,按照题意连接无向边,求欧拉回路即可。

2. AcWing 400 太鼓达人(De Bruijn序列)

简要:给定 \(k\in[2,11]\),求一个包含 \(n\) 个点的环顺时针编号为 \([1,n]\) ,每个点有权值 \(w_i\in\{0,1\}\),使其满足 \(\forall i\in[1,n]\),以其为端点顺时针提取长为 \(k\) 的连续段形成的 \(n\)01 串两两本质不同。在此基础上最大化 \(n\) 的值,并求此时字典序最小的赋值方案。

例如,输入 3,答案为 8 00010111

此题的特点是整个图为环,因此并不容易直接动态规划或贪心处理。套路地考虑 \(n\) 的上界,容易发现显然为 \(2^k\)。此时相当于先将全 \(0\) 串放在最前,然后每次左边减少一位、右边追加一位的方式不重不漏地遍历 \([0,2^{k+1}-1]\),使得字典序最小。

此时容易想到,将 \(x\) 向所追加的位分别为 \(0,1\) 形成的两个数连有向边。但是这样实际上所需求的为哈密顿回路,并且共有 \(2^{11}\) 级别的点数,并没有可预见的多项式时间解法。

在之前的模型中我们是用点来表示 01 串,所以需要经过每一个点恰一次。如果我们用边来表示每一个 01 串,则欧拉回路问题是容易解决的。我们构造一个包含 \(2^n−1\) 个点和 \(2^n\) 条有向边的图。每个点表示一个 \(n - 1\)01 串,即相邻两个子串中间相同的 \(n - 1\) 位。每一条有向边表示一个 \(n\)01 串。每个点恰好出度、入度均为 \(2\),然后钦定第一条边,跑欧拉回路即可。

这种转化的可行性是由于在具体问题中,对于每个节点,其连边具有规律性。而对于大部分图难以进行这种转化。

3. Luogu P3520 [POI2011] SMI-Garbage

需要注意的是,在实际建模问题中,往往整张图不连通,此时图一定不存在欧拉路径;但是如果在各个连通块内均找到欧拉路径,从而覆盖所有边,那么可能也是符合实际需求的。

有一个可以看成无向图的城市,上面有 \(n\) 个点和 \(m\) 条边。每一天,有若干辆垃圾车按照环形来跑一圈。并且,对于一辆垃圾车, 除了起点以外不能跑两次。

一条路有 \(2\) 种状态:清洁的(用 \(0\) 表示)或不清洁的(用 \(1\) 表示)。每次垃圾车经过,都会取反这条路的状态。

因为有些路上的人不交垃圾清理费,所以市长想要那些路变得不清洁;除此之外的路要清洁。那么,求如何安排垃圾车,才能使得市长目的达到。无解输出 NIE

此处所有边都可能多次经过,似乎不能直接用欧拉路径处理。

断言:有解当且仅当去除初始和目标状态相同的边后,图的每个连通块存在欧拉回路。


证明

以下称去除前图的一个连通块为原图,去除后的对应块为新图。

充分性:

由存在欧拉回路知,一定存在若干不出现重复边的环恰好覆盖所有边,于是直接按照这些环跑一遍即可。

必要性:

考虑假设一种合法方案中,一条被去除边被经过,那么显然跑了偶数个环交于该边。那么我们将这些环两两配对,分别删除该边再连接就可形成一个不经过该边的新环。最终可以得到一个同样合法的方案。

推断:若有解,一定存在不经过任何被去除边的方案。

从而新图一定有解。用类似于上述的方法,我们还可以把新图上任何方案转化为每条边只被经过 \(1\) 次的方案,从而新图一定存在欧拉回路。


于是对每个连通块判定并寻找欧拉回路即可。

由于要将欧拉回路转化为若干个仅在点处相交的环,根据第一部分所述,实际上点 \(x\) 相邻两次的出现就是所需的一个环。那么我们在先前存储答案的栈的基础上记录每个点是否在栈中。若加入 \(x\)\(x\) 已经在栈中,则栈顶到 \(x\) 的整个序列出栈并构成一个环。

4. Luogu P6628 [省选联考 2020 B 卷] 丁香之路

给定 \(n\) 个点完全图,\(w(i,j)=|i-j|\)。给定 \(m\) 条关键边和起点 \(s\),对 \(t=1,2,\cdots,n\)\(s\rightsquigarrow t\) 经过所有关键边至少一次的最短路。\(n\le2500,m\le \dfrac{n(n-1)}{2}\)

这里并不要求每条边 恰好 经过一次,但是我们仍然可以用欧拉路径的思想判定。

结论:在 \(m\) 条关键边的基础上添加尽量少的边(可重),使得存在 \(s\rightsquigarrow t\) 欧拉路径的最小代价即为最短路长度。

欧拉路径的条件上需要考虑两个奇点。为了减少讨论,考虑预先加入边 \((s,t)\),最后从答案中减去。那么变成欧拉回路判定:

  1. 所有点度数为偶数。
  2. \(s,t\) 及所有关键边位于同一连通块中。

考虑一种贪心:先保证所有点度数为偶数,然后每次加两条边连通各块是最优的。

即:

  1. 预先添加完上述 \(m+1\) 条边后,从左往右对所有奇度数点两两配对连一条 。即对每个对子 \((u,v)\),连接(感性理解:相比只连 \((u,v)\) 可能连通最多的块,且边权 \(w(i,j)=|i-j|\) 之和不变)

\[\begin{aligned} (u&,u+1)\cr (u+1&,u+2)\cr \vdots \cr (v-1&,v) \end{aligned} \]

  1. 对剩余的连通块跑最小生成树,得到的每条边都要贡献两次。类似上述,只需要加入 \(n-1\) 条边即可。

总复杂度 \(O((n^2+m)\log n)\)

证明

其实只需要证明 1 中根据图性质的连边方式,能保证不会出现:两连通块各留两个奇点再对应连两条边更优的情况。因为可以分讨得到这种情况下,连链时已经把两个块连通了。

5. AT2675 Two Trees

给定两棵都是 \(n\) 个节点的有根树 \(A,B\),节点均标号 \([1,n]\)。我们需要给每个标号定一个权值 \(w_i\),使在两棵树上均满足任意节点子树权值为 \(-1\)\(1\)。判断无解或输出任意方案。

图论构造题。此题存在二分图做法,和欧拉回路一样利用奇偶性的性质(如偶环)。

首先考虑节点 \(u\),其各个子树的和只能取奇数 \(-1\)\(1\)。则显然 \(w_u\) 的奇偶性恰好与其儿子个数的奇偶性相反。考虑对根节点建立超级根,连向两个根节点,则所有原图中的点,都有其权值的奇偶性等于度数

这时对于同一个标号 \(i\) 的两个点 \(a_i,b_i\),若 \(w_{a_i},w_{b_i}\) 的奇偶性不同则显然无解。否则可以考虑构造一组解。

断言:若满足上述条件,一定存在合法方案,满足 \(\forall i\in[1,n],w_i\in\{-1,0,1\}\)

证明:考虑归纳法。对于仅以叶子节点为孩子的点,若其孩子数为偶数,分别一半赋值为 \(-1\)\(1\),当前点赋值 \(1\)\(-1\) 均可;奇数同理。而此时将整棵子树看成一个叶子,即可归纳证明。

推断:若满足上述条件,则一定有解。

这个也可以归纳法证明。则接下来只需考虑构造方案,即对于度数为奇数的点,选择其权值是 \(-1\) 还是 \(1\)

其中一种套路是考虑在两个对应奇点间连无向边。则整个图必定不再存在奇点。我们的目的是对每个奇点赋值使得任意子树 点权和为 \(\pm 1\)。而仔细考察欧拉回路可以发现:

性质:对于任意连通子图,欧拉回路进出该连通子图的次数相等。

可以发现,有一次进入 / 离开一定是经过子树根到其父亲的边,剩余的边都是跨越了两棵子树,称为特殊边。

由此可以发现,进出特殊边的数目一定为奇数,并且显然进入的与离开的边差值绝对值\(1\)

因此我们直接在欧拉路上,给按照通过特殊边的方向,起始点权值 \(-1\),目标点权值 \(+1\) 即可满足要求。

6. P7684 [CEOI2005] Depot Rearrangement

简要:有长为 \(nm\) 的序列,每个元素有权值 \(a_i\)\(\forall j\in[1,m]\) 都恰好有 \(n\) 个元素的权值为 \(j\)。另外,\(nm+1\) 的位置有一个空位。现在要求执行最少的操作(每次操作将一个元素移动到 \([1,nm+1]\) 中存在的空位,原先的位置变为新的空位)使得序列中对于 \([1,m],[m+1,2m],\cdots,[(n-1)m+1,nm]\) 的每个区间,都满足区间中权值 \([1,m]\) 恰好各出现一次。要输出方案。

可以发现:所有操作都相当于将前 \(nm\) 个元素中的一个移动,然后用另一个元素填补其空缺

考虑答案的下界。显然我们希望每个元素尽可能不移动多次;但这不总是能避免,例如,一开始显然要将元素移到最后的一个位置并在合适的时机移回。

但这启发我们考虑:应当尽可能减少元素被移动到最后一个位置的操作,即让一个元素在最后一个位置停留较长的时间。梳理这期间的操作:

  1. 将一个元素移动到最后的空位。

  2. 不断在内部移动元素到空位,然后用其它元素填补新空位,以此类推,在合法情况下执行尽可能多次

  3. 将最后的元素移动到现存空位。

若将“\(v\) 移动到 \(u\) 留下的空位” 的操作看成是边 \((v,u)\),那么可以发现整个过程类似于走环。这启发我们采取欧拉回路的思想。

为了处理所处区间的限制,考虑将图扩展为有向二分图。具体来说,设左部点 \(p_i\) 表示第 \(i\) 个区间,右部点 \(q_j\) 表示颜色 \(j\)。那么我们考虑哪些移动是必须执行的。

仍然采取下界的思想,若 \(p_i\) 区间有 \(t>1\) 个颜色 \(q_j\),这至少需要执行 \(t-1\) 次移出操作,则连接 \(t-1\) 条,有向边 \((p_i,q_j)\);若\(p_i\) 区间没有颜色 \(q_j\),也需要执行至少 \(1\) 次移入,那么反向连接一条 \((q_j,p_i)\)

那么一条路径 \(p_i\to q_j \to p_k\) 表示将 \(p_i\) 中种类为 \(q_j\) 的集装箱放到(不包含颜色 \(q_j\) 的)区间 \(p_k\) 的空位中,即一次操作。容易发现如果这样走的路径形成了环,就恰好相当于进行一次完整的可行操作。因为一开始任何区间都是没有空位的,所以一定是 \(p_k\) 也存在一条路径移动到点 \(p_l\) 的空位。依次类推,若最终是移动到 \(i\) 本身,此时意味着只要 \(i\) 先被放入最后一个位置即可满足整个环上的操作。设环上有 \(t\) 条边(二分图上一定为偶数),显然这部分操作数为 \(\dfrac{t}{2}+1\)

此时问题已经非常清晰:对于每个连通块,用最少的环(可出现重复点)覆盖所有边


断言:每个连通块都是欧拉图,只需要一个这样的非简单环即可完全覆盖。

证明:显然按照上述建图,每个点的出度和入度都是相等的。


故总操作数为 \(\dfrac{E}{2}+c\)\(c\) 为连通块个数。方案按照上述方式,从路径中每两条构造一个操作即可。

7. Luogu P3511 [POI2010]MOS-Bridges

欧拉回路中,判断入度与出度的差值是一个重要的问题。这个东西与网络流很容易结合考察。下面考虑两道有关的例题。

给定一个图,边有权值且正着走和逆着走有不同权值,在这个图上求一条最大边权最小的欧拉回路,从点 \(1\) 出发,要求输出方案。\(n\le10^3,m\le2\times10^4\).

一眼二分。考虑限定边权不超过 \(mid\),则原图变为含有有向边和无向边。注意这里二分的下界显然为 \(\max_{i\in E}\{\min(w_{i,0},w_{i,1})\}\),也就是必须让每条边起码有一个方向可以出现在图中,否则不满足欧拉回路的定义。

但是可以确定的是无论无向边如何走,任何点入度与出度的和不变,记为 \(deg_i\)。则 \(mid\) 可行当且仅当 \(\forall i, in_i=out_i=\dfrac{deg_i}{2}\)。若 \(deg_i\) 为奇数,显然不存在欧拉回路。

考虑建立新图:

  1. 额外建立源点、汇点 \(S,T\),原图的边 \(i\) 对应新图的点 \(e_i\),原图的点对应新图点 \(p_i\)

  2. 对所有原图中的无向边 \(e_i=(u,v)\),在新图连流量为 \(1\) 的三条边 \((S,e_i),(e_i,p_u),(e_i,p_v)\)

  3. 对所有原图中的有向边 \((u,v)\),在新图连流量为 \(1\) 的边 \((T,e_i),(e_i,p_u)\)

  4. 对所有原图中的点 \(u\),在新图连流量为 \(\dfrac{deg_u}{2}\) 的边 \((p_u,T)\)

这相当于用各边去给各点提供出度。那么显然有解当且仅当 4 中所有边均满流,即取到出度等于 \(\dfrac{deg_u}{2}\)

这样即可判定入度等于出度的条件。根据每条无向边对应连向两个节点的哪一条满流,即可得知其方向并建出对应的有向图。根据题意,还需检查 \(1\) 是否位于一个包含图中所有边且(弱)连通的连通块。

最后在有向图上跑欧拉回路即可。

思考:假如将题中“欧拉回路”改为“欧拉路径”,应如何解决?

(考虑枚举起点。)

8. *P8291 [省选联考 2022] 学术社区

简要:有 \(n\) 个三元组 \(t_i=(a_i,b_i,c_i\in\{0,1,2\})\),定义这 \(n\) 个三元组的一种排列的权值为:满足条件的 \(i\) 的个数,使得 \(c_i=0\)\(i\ge 1,a_{i-1}=b_i\);或者 \(c_i=1\)\(i<n,a_{i+1}=b_i\)。求一个权值最大的排列,输出排列及方案。保证:对于任何出现过的 \(a_i\),至少存在一个三元组 \((a_i,b_i,c_i)\) 使得 \(c_i=2\)

先考虑部分分 A:不存在 \(c_i=1\) 的情形。

考察最终的情形,很显然应当是一个 \(c_i=2\) 的三元组后连续地跟随若干个 \(c_i=0\) 形成的一段序列。同样显然地可以对所有使得 \(a_i=b_k\) 的下标 \(i,k\),连有向边 \((b_k,a_i)\),那么上述序列就变为有向图上的一条路径。

很显然一个 \(c_i=0\) 的三元组 \(t_i\) 只要被包含在某个路径中就一定合法。

定义路径()覆盖为用若干条路径覆盖有向图上所有边的一种方案。于是可用欧拉回路的套路解决这个问题。

先考虑其中 \(7\) 个测试点 AB:不仅不存在 \(c_i=1\),而且一定能使所有 \(c_i=0\) 的三元组都满足条件。

那么我们先建立超级源点 \(T\),向所有 \(c_i=2\)\(i\) 也就是各个路径的可能起始点连有向边;再对于 \(c_i=0\) 且入度大于出度,也就是可能成为路径终点的点 \(i\),连 \(in_i-out_i\) 条边到 \(T\)。容易证明由于保证合法,所以不可能存在 \(c_i=0\) 的点入度小于出度,因为这个点不可能成为路径开头,因此假设出现这种情况显然不存在合法方案。

容易发现这时所有点都入度等于出度,并且整个图弱连通,也就是这是欧拉图。这是因为保证了对于所有点都有至少一个 \(c_i=2\),也就是 \(T\) 向所有其它点都有连边。跑欧拉回路即可得到方案。

这部分 \(O(n+m)\) 可以获得 \(42\) 分。

接下来考虑 A:不保证一定所有 \(c_i=0\) 的三元组合法。这相当于有些边不能被覆盖,即出现点入度小于出度。这时候如果仍然要跑欧拉回路,沿用上面的思想,考虑对于这些点也从 \(T\) 连边过来使得入度等于出度。那么这样得到的欧拉回路并不是全部边都能满足;但是容易发现,每连接这样的一条边,仅仅使得该点的一条多余的出边不能被满足,其余不变;也就是相当于减去多连的边的数量就是最大的答案。证明留作思考。

仍然跑欧拉回路,可获得 \(54\) 分。

接下来考虑 BC:此时存在 \(c_i=1\) 的情形,但是保证均合法,且对于任意有序数对 \(i,j\)\((i,j,1)\)\((j,i,0)\) 两者最多只出现一种

这个限制 C 可以大大简化构图,因为不可能出现 \((i,j,1)\)\((j,i,0)\) 相邻摆放形成的合法情况。

所以可能会出现的不同种类的序列,就一定是以 \(c_i=2\) 为结尾,在前面接上若干个 \(c_i=1\)。很显然一个 \(c_i=2\) 的三元组可能会被两个不同方向的序列(分别由许多 \(c_i=0\) 和许多 \(c_i=1\) 构成),于是考虑建立分层图。也就是分为两层 \(A,B\)

  1. 对所有使得 \(c_i=0\)\(i\),连有向边 \((a_i,b_i)\)

  2. 对所有使得 \(c_i=2\)\(i\),连有向边 \((a_i',a_i)\),也就是这是沟通两个不同方向序列的公共部分,并且一条边只能沟通两个序列(若有多个满足条件的 \(a_i\) 相同的 \(i\),就可以分别沟通更多序列)。

  3. 对所有使得 \(c_i=1\)\(i\),和 \(c_i=0\) 相比反向连有向边 \((b_i,a_i)\)

关于为何用分层图而不直接连边:因为 \(c_i=2\) 的中转二元组是有限的,把它抽象为两层之间的边,就保证不会过量利用 \(a_i\) 作为中转。

沿用之前的思想,直接对所有使得 \(c_k=1\) 且使得 \(a_i=b_k\) 的下标 \(i,k\),和 \(c_i=0\) 相比反向连有向边 \((i,k)\),于是这同样转化为一个路径边覆盖问题。

同样按照之前的方法,通过与 \(T\) 连边使得图成为欧拉图,并跑欧拉回路即可。注意到由于这里保证了合法,所以与 \(T\) 有关的边要么是连向 \(G'\),要么是从 \(G\) 连过来,而不需要考虑舍弃的边。

因此跑欧拉回路,可获得 \(64\) 分。

值得一提的是,这时可以证明即便存在 \((i,j,1)\)\((j,i,0)\),把它们预先放在一起计算贡献并删去它们,最后也能得到正确的结果。这就处理不满足性质 C 的情形。

关于也不满足 B 的做法,同样由于不保证所有边都可被覆盖,需要考虑舍弃的边,因而需要结合网络流分析。


之前的所有算法都在平衡图上每个点的点度以保证欧拉回路的存在,那么继续沿着这个想法行进。对于 \(G_1\) 中的点,入度大于出度时,会有 \(in_i-out_i\) 条边无法匹配;而 \(G_2\) 中则是入出度反过来。

这帮助我们得到答案的下界。但是显然这样的方案中,有些点入度大于出度,有些点出度大于入度,很可能有其余的方式把这些点关联起来覆盖更多的边。

对于一条 \((i,k,1)\),如果我们舍弃它,其实意味着这条消息被我们认作了功能与学术消息等同的消息。因此减少边 \((i,k')\),增加了边 \((i,i')\)。此时 \(a_k\) 入度减少 \(1\)\(b_i\) 出度增加 \(1\)。可以发现这可能使得之前的下界增加了 \(1\),也就是当两个点都有无法匹配的边,这次舍弃就是有用的。

为最大化这样的边的数目,类比上一题对出入度不平衡点的处理,同样可用网络流。

  1. 对于每个 \(i\),如果其出度小于入度,连流量为 \(in_{i}-out_{i}\) 的边 \((S,i)\)

  2. 对于每个 \(k'\),如果其入度小于出度,连流量为 \(out_{k'}-in_{k'}\) 的边 \((k',T)\)

  3. 对于三元组 \((i,k,1)\),连流量为 \(1\) 的边 \((k',i)\)

  4. 对于三元组 \((i,k,0)\),连流量为 \(1\) 的边 \((i,k')\)

最大流就意味着在下界基础上,可得到额外的最多满足二元组数目。这个值加上下界即为答案。

将这些边舍弃(按照先前思想变为另一种边)之后,再运行 BC 中提到的做法,跑欧拉回路即可。

思考

问题 1:给定一个有向欧拉图 \(G = (V,E)\) ,求以 1 号点为起点的欧拉路径的数量。

问题 2:给定一个有向欧拉图 \(G = (V,E)\) ,求欧拉回路的数量。

问题 3:给定一个有向欧拉图 \(G = (V,E)\) ,求欧拉回路的数量。

(论文题)

posted @ 2023-08-29 16:25  音街ウナ  阅读(312)  评论(0)    收藏  举报