P16840 [GKS 2021 #A] Checksum 题解

题解:P16840 [GKS 2021 #A] Checksum

一、前言

这是一道最大生成树问题。

二、前置知识

二分图

定义:\(G=(V,E)\) 是一个无向图,如果顶点 \(V\) 可分割为两个互不相交的子集 \((A,B)\),并且图中的每条边 \((i,j)\) 所关联的两个顶点 \(i\)\(j\) 满足 \(i \in A\)\(j \in B\),则称图 \(G\) 为一个二分图,也称作二部图。

性质:

性质一: 同一集合中的点之间没有边相连。

性质二: 图上没有奇环。

计数排序

简介: 计数排序是一种线性时间的排序算法。

思想:

对每一个输入元素 \(num\), 确定小于 \(num\) 的元素个数。利用这一信息,就可以直接把 \(num\) 放到它在输出数组中的位置上了。

算法步骤:

1、计算每个数出现了几次;

2、求出每个数出现次数的前缀和;

3、利用出现次数的前缀和,从右至左计算每个数的排名。

稳定性: 计数排序是一种稳定的排序算法。

时间复杂度分析: 计数排序的时间复杂度为 \(O(n+w)\),其中 \(w\) 代表待排序数据的值域大小。

并查集

简介: 并查集是一种用于管理元素所属集合的数据结构。

操作: 顾名思义,并查集支持合并查询两种操作。

合并: 要合并两棵树,我们只需要将一棵树的根节点连到另一棵树的根节点。

查询: 我们需要沿着树向上移动,直至找到根节点。

优化:

启发式合并: 记录每棵树的节点数,在合并时总是把节点较少或深度较小的树连到另一棵。

路径压缩: 在查询过程中,我们可以将经过的每个元素直接连到根节点以加快后续查询。

时间复杂度分析: 同时使用路径压缩和启发式合并之后,并查集的每个操作平均时间仅为 \(O(\alpha(n))\),其中 \(\alpha\) 可以看作一个很小的常数。

最大生成树:

简介: 在一个图的所有生成树中边权值和最大的生成树即为最大生成树。

实现: 将图中所有边的边权变为相反数,再跑一遍最小生成树算法。

三、题目大意

给定一个布尔矩阵 \(A\),其中有部分元素丢失,恢复矩阵中位置 \((i,j)\) 的元素需要花费 \(B_{i,j}\) 小时,求恢复原始矩阵 \(A\) 所需的最小总小时数。

四、样例解释

测试用例一:

\(A_{1,2}\) 可以通过第 \(1\) 行的校验和或第 \(2\) 列的校验和恢复,故不需要花费任何时间。

测试用例二:

五、正解部分

1、暴力:

思路:

对于测试集 \(1\),我们可以暴力枚举每一个丢失元素,对于第 \(i\) 个丢失元素 \(arr_i\),它有两种状态,分别是手动恢复和通过校验和推导,若选择手动恢复,则付出代价;若选择推导,则检查它所在的行或列是否只剩下这一个未知数。

实现:

时间复杂度分析:

注意事项:

代码如下:

2、正解:

思路:

实现:

时间复杂度分析:

注意事项:

代码如下:

六、回顾总结

posted @ 2026-07-26 21:11  Error_time  阅读(0)  评论(0)    收藏  举报