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、正解:
思路:
实现:
时间复杂度分析:
注意事项:
代码如下:

浙公网安备 33010602011771号