耳分解

\(\text{1 }\) 耳和耳分解

\(\text{1.1 }\) 耳和耳分解

对于一个无向图 \(G = (V,E)\),有一个子图 \(G_1 = (V_1,E_1)\)。若有一条环或者简单链 \(L:u_1 \to u_2 \to \cdots \cdots \to u_k\),满足条件 \(u_1,v_k \in V_1\) 并且 \(u_2,\cdots \cdots,u_k \notin V_1\),则称之为 \(L\)\(G\) 关于 \(G_1\) 的耳,特别的当 \(L\) 是一条简单路径是 \(L\)\(G\) 关于 \(G_1\) 的开耳。

对于一个无向图 \(G\),若联通图 \((G_0,G_1, \cdots \cdots ,G_k)\) 满足:

  1. \(G_0\) 是一个简单环,\(G_k = G\)

  2. \(G_{i - 1}\)\(G_i\) 的子图。

  3. \(G_i = {V_i,E_i}\),则 \(E_i\) \ \(E_{i - 1}\) 组成 \(G_{i - 1}\) 的一个耳(开耳)。

则称 \((G_0,G_1, \cdots \cdots ,G_k)\)\(G\) 的一个耳(开耳)分解。此处还有一个性质,若一个图 \(G\) 存在耳分解,当且仅当 \(G\) 边双连通。

在此处扔出两个定理:

  1. 一张有向图是可耳分解的,当且仅当它强连通。

  2. 一张无向图是可耳分解的,当且仅当它边双联通。

\(\text{1.2 }\) 双极定向

给定无向图 \(G = (V,E)\) 和两个不同的节点 \(s,t\),则一下这四个命题等价:

  1. 在添加 \((s,t)\) 之后 \(G\) 点双联通。

  2. \(G\) 的圆方树中所有方点构成一条链,\(s \to t\) 是圆方树的一条直径。

  3. 存在一种对 \(G\) 的边进行定向的方法,得到一个有向无环图,且 \(s\) 入度为零,\(t\) 出度为零,其余点出入度都不为零。

  4. 存在一个点的排列 \(p_1,p_2, \cdots \cdots ,p_k\),使得 \(p_1 = s,p_k = t\),且任意前缀和后缀的导出子图都是联通的。

证明:

  1. \(3\)\(4\):定向后直接拓扑排序。

  2. \(4\)\(3\):反过来,直接用拓扑排序定向。

  3. \(1\)\(3\):在曾加开耳的时候处理一下即可。

  4. \(4\)\(1\):设存在(加边后)割点 \(u\)(即加完边之后不是点双连通),此时 \(s,t\) 在同一连通块。另一个连通块我们设为 \(S\)。设 \(S \cup \{u\}\)\(p\) 上出现最早/晚分别是 \(x,y\),那么这两个点当中必定会有一个不是 \(u\),那么此时的 \(S\) 应于 \(s,t\) 连通,矛盾。

\(\text{2. }\) 双极定向的应用

显然的,并不是每一个图都满足双极定向的条件的。

此处为了解释双极定向的作用我们引出下面的题:

\(\text{2.1. }\) 例题

给你一张 \(n\) 个点 \(m\) 条边的无向连通图,保证不存在重边和自环。
这张图的每个点都是白色的,你想要把它们全都染成黑色。刚开始你可以选择一些点把它们染成黑色,并需要付出这些点权值之和的代价;接下来你每次可以选择一个和黑点相邻的白点,并把它染成黑色。你还需要保证在每一步操作(包括最开始染那些点)之后,所有白点的导出子图连通。
请你最小化你所需要付出的代价,并构造一组代价最小的方案。

\(\text{2.2. }\) 做法

既然我们并不会怎么计算图,那我们就从最简单的树开始。

首先,最多只能剩一个叶子在最开始没选,否则在染到另一个叶子的父亲时白点会不连通。我们把点权最大的那个叶子提根,剩下每个叶子都必须在最开始被选。构方案只需要不断剥叶子即可,可以保证始终连通。

我们从树上的做法得到启发,猜想对原图建出点双树后,只有一个叶子点双最开始没有被选,同时这个叶子是所有叶子中最小权值最大的。由于对于一组初始黑点的方案,满足所有白点初始均连通。则该初始方案合法,当且仅当所有白点构成的点双树上,至多只有一个叶子点双,使得其中的白点不与任何黑点相连通。

所以对于上面的做法我们直接模拟一遍即可。我们跑出白点导出子图中所有的割点,然后割掉非割点即可。时间复杂度为 \(O(n ^ 2)\)

发现我们实际上要操作的是删边维护割点。使用维护动态图双连通性的相关算法即可。根据前述分析,我们只需考虑原图是点双连通分量的情况,不过这时相对于原问题,会要求染黑的第一个点 \(S\) 和最后一个点 \(T\) 均固定。

我们利用删边和缩二度点这两种递归手段,足以处理任意点双连通图。

具体的,我们先找出整张图的一棵生成树,然后对于每个叶子,我们保留它最浅的一条返祖边,注意这不改变点双连通性。

这样,每个叶子就都变成了二度点,我们就可以删除所有叶子啦!

所以总的时间复杂度为 \(O(n)\)

\(\text{3. }\) 例题

\(\text{T1. Economic One-way Roads}\)

注意到 \(m \le 18\) 考虑状压 dp。

我们发现直接状压并不好做,并且这种问题可以用耳分解做,所以我们考虑耳分解。先随意进行一种定向,把代价设为改变方向的代价。然后我们反着做耳分解,状压当前的点集。然后我们只需要记录当前点集内的选择任意两点作为开头和结尾的代价径即可。这样子我们就可以轻松的得出这个点集答案了。

code为什么怎么快

\(\text{T2. 白鹭兰}\)

先考虑 \(k = 1\) 的情况。就是一个序列的前缀和后缀这就是典型的双极定理,有一个结论:这课圆方树是一条链。

回到原问题,题目相当于你可以进行无限次数的缩点,使得圆方树是一条链。这个问题等价于在圆方树上选一条链删去上面所有的方点,然后再把圆点缩到一起。

我们贪心的思考。我们每一次就取出枚举的点的最大的子树和次大的子树,然后我们就可以在这两个子树内继续进行选择了。这个是非常明显的,因为更大的子树能选出来的链肯定更大。所以我们直接定义 \(dp_u\) 为我们选择 \(u\) 这可子树的最小价值。然后 \(k\) 就是两个子树内最大的两条链之和了。

posted @ 2024-06-10 09:25  sqrtqwq  阅读(15)  评论(1编辑  收藏  举报