ABC399 G - Colorful Spanning Tree 题解搬运+翻译

news/2025/4/1 8:14:25/文章来源:https://www.cnblogs.com/zenoszheng/p/18800034

ABC399 G - Colorful Spanning Tree 题解搬运+翻译

G - 彩色生成树 题解 by en_translator


这道题涉及矩阵交集
虽然一般情况下解决矩阵交集问题需要复杂的算法,但对于称为线性矩阵交集的特殊情况,有一种简单的随机化算法,不需要复杂的实现。

矩阵的定义

一个有限集合 \(E\) 和它的子集家族 \(I\) 被称为一个矩阵 \((E, I)\) 当且仅当它们满足以下所有条件:

  • (1): \(I\) 包含空集。
  • (2): 如果 \(I\) 包含 \(X\),那么它也包含 \(X\) 的每个子集 \(Z\)
  • (3): 如果 \(X, Y \in I\)\(|X| < |Y|\),那么存在某个 \(e \in Y \setminus X\),使得 \(X \cup \{e\} \in I\)

此外,我们定义以下术语:

  • 独立集: 包含在 \(I\) 中的集合。
  • 依赖集: 不在 \(I\) 中的 \(E\) 的子集。
  • : 最大的独立集。
  • 对于 \(X \subseteq E\)\(X\) 的基: 包含在 \(X\) 中的最大独立集。

矩阵的第三个条件等价于以下条件(证明省略):

  • (3’): 对于所有 \(X \subseteq E\)\(X\) 的所有基具有相同的大小。

特别地,考虑 \(X = E\) 的情况,我们看到所有矩阵的基具有相同的大小。

矩阵的例子

让我们看一些具体的矩阵的例子。

均匀矩阵和分区矩阵

给定一个有限集合 \(E\) 和一个非负整数 \(r\),定义一个子集家族 \(I\) 如下:

\[I = \{ X \subseteq E \mid |X| \leq r \} \]

那么 \((E, I)\) 形成一个矩阵,称为 均匀矩阵
此外,均匀矩阵的直接和也形成一个矩阵,称为 分区矩阵。具体来说,给定 \(E\) 的一个分区,记为 \(\{ E_1, E_2, \dots, E_k \}\),以及非负整数 \(r_1, r_2, \dots, r_k\),定义 \(I\) 如下:

\[I = \{ X \subseteq E \mid \forall i \in \{ 1,2,\dots, k \}, |X \cap E_i| \leq r_i \} \]

那么 \((E, I)\) 也是一个矩阵。(对于所有条件 (1)、(2) 和 (3) 的证明是直接的。)

线性矩阵

考虑一个矩阵 \(A\),令 \(E\)\(A\) 的列的集合。定义 \(I\) 如下:

\[I = \{ X \subseteq E \mid X \text{ 中的列是线性无关的} \} \]

那么 \((E, I)\) 形成一个矩阵,称为 线性矩阵。(可以证明,因为 (1)、(2) 和 (3’) 都直接来自线性代数。)

循环矩阵(图形矩阵)

\(E\) 为图 \(G\) 的边的集合,令 \(V\) 为图 \(G\) 的顶点集合。定义 \(I\) 如下:

\[I = \{ X \subseteq E \mid \text{图 } (V, X) \text{ 不包含循环} \} \]

那么 \((E, I)\) 形成一个矩阵,称为 循环矩阵(也称为 图形矩阵)。(证明很简单,因为条件 (1)、(2) 和 (3’) 自然成立。)

矩阵交集

与矩阵相关的问题中一个常见的话题是 矩阵交集
给定两个矩阵 \((E, I_1)\)\((E, I_2)\),它们的交集 \(I_1 \cap I_2\) 定义如下:

\[I_1 \cap I_2 = \{ X \mid X \in I_1, X \in I_2 \} \]

寻找 \(X \in I_1 \cap I_2\),使得 \(\vert X \vert\) 最大的问题称为 矩阵交集问题

一个众所周知的可以用矩阵交集描述的问题是二分图的最大匹配。考虑一个具有部分集 \(U\)\(V\) 及边集 \(E\) 的二分图。\(U\) 的匹配条件要求每个 \(u \in U\) 至多选择一条相邻边,这可以表示为一个分区矩阵。同样,\(V\) 上的匹配条件也可以表示为一个分区矩阵。因此,二分图的匹配可以看作两个分区矩阵的交集。许多其他问题也可以表述为矩阵交集。

已知矩阵交集问题可以在多项式时间内解决(大约为 \(\mathrm{O}(|E|^2 r)\),其中 \(r\) 是解集的大小),但算法复杂,这里省略。有关更多详细信息,请参考以下资源(以日文):

  • 冈本义夫的讲义,hitonanode 的实现示例

线性矩阵交集

矩阵交集的一个特殊情况是 线性矩阵交集 问题。
已知如果我们只寻求解的大小,线性矩阵交集问题可以比一般的矩阵交集问题更简洁地解决。

我们首先对问题进行表述。令 \(A_1\)\(A_2\) 为具有相同列数的矩阵,令 \(E\) 为列的集合。然后,我们可以定义对应于 \(A_1\)\(A_2\) 的线性矩阵 \((E, I_1)\)\((E, I_2)\)。交集 \(I_1 \cap I_2\) 被称为 线性矩阵交集

对于线性矩阵交集问题,以下命题成立:

使用变量 \(x_1, x_2, \dots, x_{\vert E \vert}\) 定义多项式矩阵 \(D\)\(M\) 如下:

\(D = \mathrm{diag}(x_e)\)(一个 \(E \times E\) 的对角矩阵,主对角线上是 \(x_e\)),

\(M = A_1 D A_2^{T}\)

则线性矩阵交集问题的解的大小等于 \(\mathrm{rank}(M)\)

有关证明,请参见 Oshiro Taihei 的材料。

根据上述命题,解决线性矩阵交集问题归结为计算多项式矩阵的秩。直接计算多项式矩阵的秩是困难的,但可以通过为变量替换随机值并计算结果矩阵的秩(模 \(p\))来以高概率找到它。(这种方法的有效性由 Schwarz-Zippel 引理 保证。)因此,设 \(n\)\(A_1\)\(A_2\) 的较大行数,\(m\) 为较小的行数,我们可以在大约 \(\mathrm{O}(nm^2)\) 的时间内计算线性矩阵交集问题的解的大小。

线性矩阵交集的具体例子(Edmonds 矩阵)

作为线性矩阵交集的具体例子,让我们考虑二分图的最大匹配问题和 Edmonds 矩阵。
设分区集合为 \(U\)\(V\),边集为 \(E\)。二分图的 Edmonds 矩阵 \(N\) 定义如下:

\[N_{u,v} = \begin{cases} x_{u,v} & \text{如果 } (u,v) \in E \\ 0 & \text{否则.} \end{cases} \]

在这种情况下,二分图的最大匹配的大小等于 \(\mathrm{rank}(N)\)。这个事实可以在不使用线性矩阵交集的情况下证明,但这里我们将使用线性矩阵交集来证明它。

如前所述,二分图的最大匹配可以表示为两个分区矩阵的交集。通过进一步转换,我们可以将其简化为线性矩阵交集。令 \(\mathbf{e}_i\) 表示一个列向量,其中第 \(i\) 个分量为 1,其他分量为 0。我们定义矩阵 \(A_1\)\(A_2\),使得 \(A_1\) 中与边 \(e=(u,v)\) 对应的列向量为 \(\mathbf{e}_u\),而 \(A_2\) 中对应的列向量为 \(\mathbf{e}_v\)。通过这种方式选择 \(A_1\)\(A_2\),我们可以将二分图中的匹配表示为对应于 \(A_1\)\(A_2\) 的线性矩阵 \(I_1\)\(I_2\) 的交集。

现在,计算矩阵 \(M\),我们得到:

\[\begin{aligned} M &= A_1 D A_2^{T} \\ &= \sum_{e=(u,v) \in E} \mathbf{e}_u \mathbf{e}_v^T x_{u,v} \end{aligned} \]

这里,\(\mathbf{e}_u \mathbf{e}_v^T\) 是一个只有 \(uv\)-th 分量为 1,其他分量为 0 的矩阵。因此,我们可以确认 \(M\) 与 Edmonds 矩阵 \(N\) 相匹配,因此我们可以得出结论,二分图的最大匹配的大小等于 \(\mathrm{rank}(N)\)

问题的解决方案

如标题所示,这个问题涉及 彩色生成树。彩色生成树是指问题陈述中定义的生成树(尽管从学术上讲,它似乎指的是 \(A_i = 1\) 的情况)。寻找彩色生成树的问题是一个著名的矩阵交集的例子。

首先考虑在没有 \((L, R)\) 约束的情况下确定是否存在彩色生成树的简单情况。令图为 \((V, E)\),令 \(E_c\) 为颜色 \(c\) 的边的集合。如果我们定义

\[I_1 = \{ X \subseteq E \mid \forall c \in \{ 1,2,\dots, C \}, |X \cap E_c| \leq A_c \} \]

\[I_2 = \{ X \subseteq E \mid \text{图 }(V, X) \text{ 不包含循环} \} \]

那么 \((E, I_1)\)\((E, I_2)\) 分别是一个分区矩阵和一个循环矩阵。边集 \(X\) 形成彩色生成树的条件是 \(X \in I_1 \cap I_2\)\(\vert X \vert = N-1\)。因此,结合 \(I_2\) 的基的大小为 \(N-1\) 的事实,我们可以得出结论,确定是否存在彩色生成树的问题等价于确定交集 \(I_1 \cap I_2\) 中最大的集合的大小是否为 \(N-1\)

因此,我们发现这个问题可以使用矩阵交集算法在多项式时间内解决。让我们进一步转换问题,将其简化为线性矩阵交集。换句话说,我们将把分区矩阵和循环矩阵转换为对应于某个矩阵的线性矩阵。
\(A_1\)\(A_2\) 为与 \(I_1\)\(I_2\) 对应的模 \(p\) 整数的矩阵(其中 \(p\) 是一个足够大的素数)。我们需要仔细设计 \(A_1\)\(A_2\) 以建立适当的对应关系。
设计 \(A_2\) 相对简单:我们可以将行数设置为 \(N\),并将每条边 \((u, v)\) 对应的列向量设置为 \(u\) 组件为 1,\(v\) 组件为 -1。有效性可以从最小依赖集的列向量形成循环的事实中证明。
设计 \(A_1\) 则不那么明显;我们希望有一个结构,其中至多可以选择 \(A_c\) 列向量。一个可能的设计如下:

  • \(\sum_{c=1}^C A_c = K\)\(A_1\) 将是一个具有 \(K\) 行和 \(\vert E \vert\) 列的矩阵。
  • 将前 \(A_1\) 行分配给颜色 1,接下来的 \(A_2\) 行分配给颜色 2,依此类推。
  • 对于颜色 \(c\) 的边对应的列向量定义如下:
    • 假设当前向量是第 \(n\) 个向量。那么,对于与颜色 \(c\) 对应的行,第一行将包含 \(n^0\),第二行将包含 \(n^1\),直到第 \(A_c\) 行,将包含 \(n^{A_c-1}\)。所有其他行将填充为 0。

\(A_1\) 的有效性来自于 Vandermonde 行列式 不为零的事实。

现在,通过上述方法,我们将矩阵交集简化为线性矩阵交集。因此,对于没有 \(L\)\(R\) 约束的情况,可以通过应用线性矩阵交集的随机化算法来解决问题。

现在让我们考虑原始问题,即计算满足问题陈述中条件的有效对 \((L, R)\) 的数量。关注出现在随机化算法中的矩阵 \(M = A_1 D A_2^T\),我们观察到颜色 \(c\) 的边仅影响与颜色 \(c\) 对应的行。设 \(S_c = \sum_{i=1}^{c-1} A_i\),我们发现对于 \((L, R)\) 满足问题陈述中的条件,相当于由 \(M\) 的行 \(S_L+1\)\(S_R\) 形成的子矩阵的秩为 \(N-1\)。因此,如果我们能解决以下问题,就可以确定每个 \((L, R)\) 是否满足条件。

对于 \(c=1,2,\dots,C\) 解决以下问题:

  • 从行 \(S_c+1\) 开始,向下进行。当前已看到的行形成的子矩阵的秩首次变为 \(N-1\) 的行是第几行?

这个问题可以通过一个添加行向量并维护基的算法为每个 \(c=1,2,\dots,C\) 解决,时间复杂度为 \(\mathrm{O}(N^2 C K)\)。此外,使用在 ABC223H 中介绍的技术,时间复杂度可以降低到 \(\mathrm{O}(N^2 K)\)。(详细解释省略。)

通过适当地实施这些观察,我们可以在 \(\mathrm{O}(N^2 K)\) 时间内解决问题,其中 \(\sum_{c=1}^C A_c = K\),这已经足够快。由于约束相对宽松,\(\mathrm{O}(N^2 C K)\) 的解法也会通过,只要常数因子合适。

  • 作为替代解决方案,让我们考虑使用一般的矩阵交集算法来解决这个问题。事实上,以下事实成立:
    • 对于每种颜色 \(c\),如果我们取一个最大子森林并移除不属于它的边,则问题的答案保持不变。
  • 利用这一事实,我们可以在某种程度上减少边集 \(E\) 的大小,并通过使用滑动窗口技术的通用矩阵交集算法,该算法将在 \(\mathrm{O}(N^3 C^2)\) 时间内运行。这可能会导致 TLE(超时),但通过常数因子的加速和一些有效的剪枝,我们推测解决方案可能会通过。

额外

  1. 通过应用当前算法,我们可以在 \(\mathrm{O}(W n^4)\) 时间内解决加权线性矩阵交集问题,即找到最大值 \(\sum_{e \in X} w_e\) 使得 \(X \in I_1 \cap I_2\)。让我们思考一下。

  2. 这个问题(剧透警告) 实际上是受到矩阵交集问题的启发,答案可以表示为某个矩阵的行列式。让我们尝试用矩阵交集来解释这个问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907901.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

滚动部署学习指南:从理论到实践,掌握关键技术和流程

一、滚动部署概述 (一)定义 滚动部署是一种逐步更新应用实例的策略,通过逐批次替换旧版本实例来完成版本升级,以减少服务中断时间并降低更新风险。 (二)应用场景 滚动部署适用于需要高可用性和低风险的软件更新场景,例如 Web 应用程序更新、移动应用后端服务更新以及云原…

ctfshow-web入门-爆破(web21-web28)

web21 打开后要求登录附件是一个密码字典使用bp抓包,将抓到的东西进行base64解码发现是admin:密码的键值对添加payload,padload类型为自定义迭代器,位置1为admin:位置2为导入的字典添加base64编码和取消url编码然后开始攻击,发现长度和其他不同的包,查看响应,发现flagweb…

灰度发布学习大纲:从理论到实践,掌握关键技术和流程

一、灰度发布概述 1. 定义与别名灰度发布:一种渐进式的软件发布策略,也被称为金丝雀发布(Canary Release)。 目的:通过逐步向用户群体推送更新,降低新版本引入的潜在风险,提升用户体验,实现不停机的热迁移。2. 灰度发布的优势降低风险:逐步验证新版本的稳定性。 快速反…

代码随心录第三天|Leecode 203.移除链表元素 707.设计链表 206.反转链表

1、Leecode 203.移除链表元素 题目链接:https://leetcode.cn/problems/remove-linked-list-elements/description/ 题目描述:解题思路:移除操作就是让节点next指针直接指向下下一个节点,因为单链表的特殊性,只能指向下一个节点,所以头节点需要单独考虑,这种方法是直接使…

【THM】Linux Privilege Escalation

Linux Privilege Escalation/Linux 权限提升 什么是权限提升 “权限提升”是什么意思? 权限提升通常涉及从较低权限的帐户到较高权限的帐户。 从技术上讲,它是利用操作系统或应用程序中的漏洞、设计缺陷或配置疏忽来获得对通常限制用户访问的资源的未经授权的访问。 权限提升…

kettle从入门到精通 第九十三课 ETL之kettle kettle 调用web service接口5种方法,一文彻底搞懂

场景:群里有小伙伴向我求助如何调用web service接口,趁着周末时间,给兄弟们搞demo。 1、本次使用的web service服务接口地址是http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?op=getSupportCityDataset, 此接口根据用户输入的城市名称可获取城市下属单位,如下图所示…

分享一款替代 GitLab 的开源软件 gogs ,适合中小企业,非常优秀!

这篇文章,分享一款替代 GitLab 的开源软件 gogs ,Github 上有 4 万多颗 star ,笔者认为它非常优秀 ,适合中小企业。1 Gogs 简介 Gogs 是一款极易搭建的自助 Git 服务,它使用 Go 语言开发,只要 Go 语言支持的平台它都支持,包括 Linux 、Mac OS X、Windows 以及 ARM 平台。…

【闲话 No.3】 并查集相关

并查集的复杂度证明及可持久化。命に嫌われている。 小唐话 感觉有的时候已经无法与人正常交流,净做唐事、说些唐话了。或许是我无法准确猜到别人喜欢什么吧。 不过还是自己心底一点 joker 之心/私心作祟吧。 感觉我有时做的唐事真的挺对不起大家的。 可我又怎么战胜心底的那…

3.29 学习记录

实现了科技页面的树状图查询和分页查询

Django - admin djangoql

效果: 1. pip installpip install djangoql 2. settings.pyINSTALLED_APPS = [djangoql, ] 3. admin.pyfrom django.contrib import admin from djangoql.admin import DjangoQLSearchMixinfrom .models import *@admin.register(User) class UserAdmin(DjangoQLSearchMixi…

[rCore学习笔记 025 extend] 带优先级的抢占式调度

引言 因为rcore并非设计为一个rtos,而是在我们需要的时候我们需要在设计的时候考虑到线程切换的时候的延时问题. 回顾上一部分的使用环形队列进行调度的方式,我们会发现我们寻找下一个Ready的任务的时间是不均匀的.并且我们的任务是没有优先级的,可以认为是平权的,因此,为了:快…