From a7e16a135f34cd0eb445d72b2e8182006f574766 Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Mon, 26 Aug 2024 14:56:16 +0800 Subject: [PATCH] update --- 20240826/learn.md | 82 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/20240826/learn.md b/20240826/learn.md index 87f340c..abd468f 100644 --- a/20240826/learn.md +++ b/20240826/learn.md @@ -1,3 +1,84 @@ +# 选择题 + +## 7 + +> 邻接表(node{vector}}) $\neq$ 邻接矩阵(array[n][n]) + +## 8 + +### 二分图 + +节点由两个集合组成,且两个集合内部没有边的图。 + +二分图(Bipartite Graph)是一种特殊的图(graph),它的顶点集可以被划分为两个不相交的子集,使得每条边的两个端点分别属于这两个子集。简单来说,在二分图中,图的所有顶点可以分成两部分,且每条边都连接来自不同部分的顶点。 + +形式化定义: + +- **G = (V, E)** 是一个图,其中 **V** 是顶点集,**E** 是边集。 +- **G** 是二分图,当且仅当存在一个划分 **(V1, V2)**,使得 **V1 ∪ V2 = V** 且 **V1 ∩ V2 = ∅**(即 **V1** 和 **V2** 不重叠),并且对于所有的 **(u, v) ∈ E**,都有 **u ∈ V1** 且 **v ∈ V2** 或者 **u ∈ V2** 且 **v ∈ V1**。 + +### 二分图的性质 + +1. **无奇环**:二分图中不包含奇数长度的环。如果一个图中不包含奇环,那么它一定是二分图。 +2. **着色**:二分图是可以用两种颜色对所有顶点进行着色的图,且相邻顶点不会有相同的颜色。 + +### 二分图的应用 + +- **匹配问题**:二分图常用于解决匹配问题(Matching),如最大匹配(Maximum Matching)和最大流问题中的二分图匹配。 +- **分组问题**:二分图用于建模需要将元素分为两个组的情况,比如在网络中将用户和服务器分开。 +- **任务分配**:在任务分配问题中,将任务和资源建模为二分图,找到最优分配方式。 + +### 如何判断一个图是否是二分图 + +常用的方法是**染色法**(BFS或DFS): + +- 从任意一个顶点开始,将其染成一种颜色(如红色),然后将与其相邻的所有顶点染成另一种颜色(如蓝色)。 +- 对每个未被访问的顶点重复上述步骤。 +- 如果过程中发现一个顶点需要染成两种不同的颜色,则图不是二分图;否则,图是二分图。 + +要计算 $ n $ 个顶点的二分图最多可以有多少条边,首先需要了解二分图的结构特性。二分图的顶点集可以划分为两个不相交的子集 $ V_1 $ 和 $ V_2 $,并且每条边都连接来自不同子集的顶点。因此,二分图的边数受限于这两个子集中顶点的数目。 + +### 分析 + +设 $ V_1 $ 和 $ V_2 $ 是二分图的两个顶点集,其中 $ |V_1| = n_1 $ 和 $ |V_2| = n_2 $,且 $ n_1 + n_2 = n $。在二分图中,所有的边都连接 $ V_1 $ 中的顶点和 $ V_2 $ 中的顶点,所以最大边数就是两个子集之间所有可能的连接数。 + +#### 最大边数 + +最大边数 $ E_{\text{max}} $ 就是所有可能的边数,即: +$E_{\text{max}} = n_1 \times n_2$ + +要使 $E_{\text{max}}$ 最大化,我们需要尽量均匀地分配顶点给 $ V_1 $ 和 $V_2 $。 + +### 最大化边数的分配 + +为了最大化 $ n_1 \times n_2 $,我们应该让 $ n_1 $ 和 $ n_2 $ 尽量接近。数学上,给定 $ n = n_1 + n_2 $,如果 $ n $ 是偶数,则最佳分配是 $ n_1 = n/2 $ 和 $ n_2 = n/2 $;如果 $ n $ 是奇数,则最佳分配是 $ n_1 = \lfloor n/2 \rfloor $ 和 $ n_2 = \lceil n/2 \rceil $。 + +根据这些分配方式,我们可以总结如下: + +1. **如果 $ n $ 是偶数**: + $$ + E_{\text{max}} = \left(\frac{n}{2}\right) \times \left(\frac{n}{2}\right) = \frac{n^2}{4} + $$ +2. **如果 $ n $ 是奇数**: + $$ + E_{\text{max}} = \left(\left\lfloor \frac{n}{2} \right\rfloor \right) \times \left(\left\lceil \frac{n}{2} \right\rceil \right) = \left(\frac{n-1}{2}\right) \times \left(\frac{n+1}{2}\right) = \frac{n^2 - 1}{4} + $$ + +### 结论 + +综上所述,给定 $ n $ 个顶点的二分图最多可以有: + +$$ +E_{\text{max}} = \left\{ +\begin{array}{ll} +\frac{n^2}{4}, & \text{如果 } n \text{ 是偶数} \\ +\frac{n^2 - 1}{4}, & \text{如果 } n \text{ 是奇数} +\end{array} +\right. +$$ + +这意味着当 $ n $ 个顶点均匀地分配在两个子集中时,二分图能够包含最多的边。 + # 编程选择题 ## 2 @@ -76,7 +157,6 @@ int main() { 该代码的主要功能是在一个未排序的数组中寻找第 `k` 小的元素,使用快速选择算法,它的平均时间复杂度为 `O(n)`。 - 如果数组中的数字是**单调递增**或**单调递减**,`find` 函数仍然可以正确地找到第 `k` 小的元素,但在最坏情况下,算法的性能可能会变差。 ### 单调递增的情况