竞赛
考级
题目 A30480.【PY】就不告诉你 代码 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 注:此题帖主已通过\color{green}{注:此题帖主已通过}注:此题帖主已通过
> 代码#20总是TLE,求助
C++ 学习讨论・正式引入 我们先从一个简单而经典的概率模型开始,它不仅能帮我们理解期望、随机游走、复杂度分析这些核心思想,更是许多高级算法(如动态规划优化、树上 DP、网格问题)的重要突破口。 一个数轴,初始点在 0 位置。一共移动 n 次,每次以 1/2 概率 +1,1/2 概率 −1。 我们想知道两个问题: 最终位置的绝对值期望 E [|x|] 是多少? 全过程中到达过的最远位置的绝对值期望是多少? 第一个问题很容易证明: E [x²] = n,因此 E [|x|] ≤ √n,也就是 O (√n) 级别。 而第二个问题 ——最大偏离原点的距离期望,证明会更巧妙: 利用非负随机变量的期望公式 E [M] = Σ Pr (M ≥ t) 结合反射原理与高斯尾估计,可以得到 Pr (M ≥ t) ≤ 4e^(−t²/(2n)) 对 t 求和后依然得到: E[M] = O(√n) 这是一个极其关键的结论: 随机游走的偏离范围,永远只会达到 O (√n) 级别。 为什么这个结论对 C++ 算法题至关重要? 因为它能直接把暴力无法通过的题目优化到可过复杂度: 高维网格 DP 太大? 利用随机游走偏离 O (√n),直接截断坐标范围。 树上 DP 状态爆炸? 把链长差值看作游走,只保留 ±√n 以内状态。 ** bitset 优化不够快?** 结合随机打乱 + 范围截断,复杂度直接降维。 你给的两道难题: 六边形网格 idea 可行性 DP 树上选 4 边不重叠路径最大权值 DP 它们的正解核心,全部来自这一句话: 随机游走的最大偏离是 O (√n)。 学习讨论核心收获 期望与概率分析不只是数学,更是算法优化武器。 很多看似 O (n²) 的 DP,都能用游走截断变成 O (n√n)。 C++ 实现技巧:random_shuffle、bitset、状态截断、树上 DP 优化。 高级题目通用思路: 暴力 → 发现游走结构 → 截断范围 → AC
一、引入 树作为图论中最特殊、应用最广的无环连通结构,是 C++ 算法学习里重中之重。相比于线性数组、字符串,树引入了父子关系、子树、深度、直径、LCA、路径等全新概念,同时衍生出大量经典 DP 与贪心模型。很多看似复杂的竞赛题、期末考题,本质都只是树上基础模型的变形。 二、树的基础核心知识点 树的存储方式邻接表是最通用的写法,用 vector<vector<int>> 存边,适合无根树、有根树、带权树,适配所有树论题。 树的遍历深度优先 DFS、广度优先 BFS 是一切树上算法的基础: DFS 适合递归处理子树、树形 DP; BFS 适合求层次、深度、最短路、拓扑序。 基础经典模型树的直径、叶子节点统计、子树大小、树的重心、最近公共祖先 LCA,都是高频模板,必须熟练手写。 三、树上动态规划核心思想 树形 DP 一般采用后序遍历:先递归处理所有儿子子树,再合并儿子信息更新当前节点答案。 常规思路: 设状态 f[u][...] 表示以 u 为根的子树的最优答案; 递归遍历所有子节点; 把每个儿子的 dp 值合并到父节点; 最终根节点状态即为全局答案。 简单模型如:最大独立集、树的最大权独立集、选不相交路径、链覆盖等,都遵循这套套路。 四、树上算法的高级优化思路 很多朴素树形 DP 是 O(n2),无法通过大数据范围,常用优化手段: 随机打乱邻接表把儿子顺序随机化,利用类似随机游走思想,状态偏移只会在 O(n ) 范围内波动,截断多余状态,把复杂度压到 O(nn )。 状态压缩与值域截断像路径匹配、链长合并类题目,不用维护全部差值,只保留有限区间内的状态,舍弃极端不可能到达的值。 换根 DP、长链剖分、点分治分别解决二次统计、深度相关问题、全局路径统计等难题,是树论进阶必备。 五、典型例题思想归纳 以树上选取四条边组成不重叠简单路径,求最大边权和这类题目为例: 设计状态 f[u][0/1/2/3] 记录当前节点挂载不同长度链的最优值; 用辅助数组 g 合并儿子信息; 把链长差值抽象成数轴随机游走,只维护小范围状态; 随机打乱儿子顺序、截断无用状态,成功把复杂度从平方级优化到可过范围。 这类题的核心思想和随机游走期望结论一致:差值不会无限扩散,只需维护局部有限状态。 六、学习收获与总结 树的所有高级算法,根基都是 DFS、BFS 与基础树形 DP; 子树合并、状态设计、后序转移是树上解题通用套路; 遇到 O(n2) 暴力无法通过时,可以利用随机游走思想、随机打乱、值域截断进行根号级优化; 学好树论,不仅能应付期末考试,也是进阶图论、竞赛算法、高级 DP 的必备基础。
C++ 框架目录 求赞和评论 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 函数内容 使用说明 n是长度 x是数字 返回布尔值1或0 注意这个是在数组中找数字 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 找第一个 找最后一个 使用说明 返回下标 l是起点 r是终点 x是数字 注意:这个是在数组中找数字,数组需要排序
我寻思这道题可以用打表做。。。
作者有代码格式强迫症 很长的分割线 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 很长的分割线
本道题只要把input每一行都存入一个变量,如: a = input() b = input() c = input() 再一起输出 print(a,b,c) 就完成了。 参考答案 a = input() b = input() c = input() print(a,b,c)
需要看题有些大小写不对需要修改
好难啊啊
TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE
太难了
先看这一帖 一、 核心概念与公理 * 样本空间 (Ω\OmegaΩ):随机试验所有可能结果的集合,是概率计算的“全集”。 * 事件:样本空间的子集。包含关系 A⊂BA \subset BA⊂B 表示A发生则B必然发生;互斥 (A∩B=∅A \cap B = \emptysetA∩B=∅) 表示两事件不能同时发生。 * 概率公理 (Kolmogorov): 1. 非负性:P(A)≥0P(A) \ge 0P(A)≥0 2. 规范性:P(Ω)=1P(\Omega) = 1P(Ω)=1 3. 可列可加性:互斥事件和的概率等于概率之和。 二、 五大核心计算公式 这是解题的基石,务必熟练掌握: 1. 加法公式:P(A∪B)=P(A)+P(B)−P(AB)P(A \cup B) = P(A) + P(B) - P(AB)P(A∪B)=P(A)+P(B)−P(AB)(防止重叠部分重复计算)。 2. 减法公式:P(B−A)=P(B)−P(AB)P(B-A) = P(B) - P(AB)P(B−A)=P(B)−P(AB)。 3. 乘法公式:P(AB)=P(A)P(B∣A)P(AB) = P(A)P(B|A)P(AB)=P(A)P(B∣A)(A发生后B发生的概率)。 4. 全概率公式:P(A)=∑P(Bi)P(A∣Bi)P(A) = \sum P(B_i)P(A|B_i)P(A)=∑P(Bi )P(A∣Bi )(通过划分原因 BiB_iBi 来求结果 AAA 的总概率)。 5. 贝叶斯公式:P(Bi∣A)=P(Bi)P(A∣Bi)P(A)P(B_i|A) = \frac{P(B_i)P(A|B_i)}{P(A)}P(Bi ∣A)=P(A)P(Bi )P(A∣Bi ) (已知结果 AAA 发生,反推是由原因 BiB_iBi 导致的概率,即“后验概率”)。 三、 常见概型与分布 * 古典概型:适用于结果有限且等可能的场景,P(A)=有利结果数总结果数P(A) = \frac{\text{有利结果数}}{\text{总结果数}}P(A)=总结果数有利结果数 。 * 几何概型:适用于结果无限且连续的场景(如长度、面积),P(A)=构成事件A的测度试验的全部结果测度P(A) = \frac{\text{构成事件A的测度}}{\text{试验的全部结果测度}}P(A)=试验的全部结果测度构成事件A的测度 。 * 常用分布: * 离散型:0-1分布、二项分布(n重伯努利试验)、泊松分布(稀有事件计数)。 * 连续型:均匀分布、指数分布(寿命模型)、正态分布(钟形曲线,自然界最常见)。 四、 进阶核心概念 * 事件独立性:若 P(AB)=P(A)P(B)P(AB) = P(A)P(B)P(AB)=P(A)P(B),则A、B独立(发生互不影响)。注意:两两独立 ≠\neq= 相互独立。 * 随机变量:将随机试验结果映射到实数的函数 X(e)X(e)X(e),分为离散型和连续型。 * 数字特征: * 期望 E(X)E(X)E(X):随机变量的加权平均值(重心)。 * 方差 D(X)D(X)D(X):描述数据波动程度,D(X)=E(X2)−[E(X)]2D(X) = E(X^2) - [E(X)]^2D(X)=E(X2)−[E(X)]2。 * 协方差与相关系数:描述两个变量间的线性相关性。
我都用埃筛了还有一个超时
问一下这题属于“结构体”吗?
@蜜果,这道题数据比较大,需要使用比较快速的方式去做。 主要代码: 详见题解。
fjsdjflkdsflsdjflkdsjfklsjflksjfkljlksjflkdjkflsdjfklsdjlkgfjslkjdf ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 二分图染色讲解 一、核心基础概念 1. 二分图定义 二分图,又称作二部图,是一种特殊的无向图。 它的所有顶点可以被划分成两个互不相交的独立集合,满足: * 图中任意一条边的两个端点,一定分属两个不同的集合 * 同一个集合内部的任意两个顶点,没有直接相连的边 简单理解:把整张图的点分成黑白两组,所有连线都只能是「黑→白」,绝对不能出现「黑→黑」的连线或者「白→白」的连线。 2. 二分图染色的本质 二分图染色就是二分图判定的标准算法,核心逻辑: 用两种颜色对图中所有节点进行标记,相邻节点必须染成不同颜色;如果染色过程中出现冲突(相邻节点颜色相同),则这张图不是二分图。 3. 二分图的核心判定定理 一张无向图是二分图,当且仅当图中不存在奇数长度的环(奇环)。 * 有偶环(4、6、8个节点的环):可以正常二分染色,是二分图 * 有奇环(3、5、7个节点的环):染色必然冲突,不是二分图 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 二、二分图染色算法规则 基础约定 * 用数组 color[] 记录每个节点的颜色 * color[u] = 0:表示节点u未被染色、未被访问 * color[u] = 1 / 2:两种区分颜色,代表两个不同集合 染色核心规则 1. 从一个未染色的起点出发,先给起点染成颜色1 2. 遍历当前节点的所有相邻节点: * 相邻节点未染色:染成和当前节点相反的颜色(1与2互换),继续递归/遍历 * 相邻节点已染色:判断颜色是否和当前节点冲突 * 颜色相同:直接判定不是二分图,染色失败 * 颜色不同:合法,跳过该节点 3. 图可能不连通,必须遍历所有未染色的节点,分别执行染色 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 三、两种标准实现模板 通用说明 * 基于DFS/BFS基础扩展 * 采用邻接表存储,适配考级大数据范围 ※ 模板1:DFS深度优先染色 ※ ※ 模板2:BFS广度优先染色 ※ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 四、考场高频易错点 1. 必须处理非连通图 绝大多数考生丢分点:只遍历起点,忽略了图中不连通的独立子图,只要有一个子图不是二分图,整张图就不是二分图。 2. 无向图要双向存边 读入边u->v时,必须同时把v加入u的邻接表、u加入v的邻接表,少写一句直接染色错误。 3. 冲突后必须提前剪枝 发现冲突后不要继续遍历,直接终止算法,避免无效运行、逻辑混乱。 4. 颜色初始值必须为0 不能用1、2作为未标记状态,0是固定约定,避免和染色值冲突。 5. 二分图染色只适用于无向图 有向图不能直接用这套染色逻辑 6. 如果有任意一个节点未被染色,都要从当前节点开始bfs/dfs ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 五、核心内容速记总结 1. 二分图:点分两组,边只跨组,无同组边,无奇环。 2. 染色规则:相邻异色,冲突则非二分图。 3. 反色公式:3−c3 - c3−c,1和2快速互换。 4. 关键操作:遍历所有未染色节点,处理非连通图。
共8963条