杂题选讲 #1:二分图边着色
Vizing 定理
定义
考虑如下的问题:对一个无向图的边进行着色,要求相邻的边染不同种颜色。问
需要的最少的颜色数是多少。
解决上述问题需要借助 Vizing 定理(又称维金定理)。
在开始之前,我们先进行一些符号的规定。
:无向图 的最大度数,即 ; :若无向图 是 - 边可着色的,但不是 - 边可着色的,则称 为 的边色数,记为 。
Vizing 定理的内容如下:
- 对于简单无向图
,有 ; - 特别地,对于二分图
,有 。
我们今天仅讨论后者的情况,即二分图的边着色。
证明
二分图上的 Vizing 定理为什么是正确的?
首先,必要性是显然的——不可能用比某个点的度数还少的颜
色数完成着色。
至于充分性,使用构造性证明。考虑执行如下算法:
对于二分图
加入一条边
如果
否则令
这样可能还会产生矛盾,假设这条边连接的另一个结点(设为
我们发现这是一个不断寻找增广路并对路径上的边交替染色的过程。
由于二分图不存在奇环,所以结点
时间复杂度
模板题 CF600F
题意简述
构造出一组二分图边着色方案使得使用的颜色数最少。
数据范围:
题目信息
来源:Codeforces
难度:
正解
解法:完完全全的模板。实现时可以将其封装成一个类。
参考代码(C++17):
Submission #247875843 - Codeforces
[SNOI2024] 拉丁方
题意简述
定义一个
给定一个矩阵
数据范围:多测,
题目信息
来源:陕西省 NOI 省队选拔赛 2024 D1T3
难度:
特殊性质 B: 。
解法:从特殊性质 B 出发,可以观察到在这种情况下每一列要填哪些值都知道了,但是不知道每个值要填在哪一行。
于是考虑建出二分图,由未使用的值向列连边;因为要求同一行不能有相同的值,所以直接跑二分图边染色。
最终每条边的颜色即为该值在该列的行数。
可以证明这种情况下一定有解:此时对于每种颜色所有边构成了一组完美匹配。
正解
那么如何将上述做法扩展到
考虑把原矩阵“补”成一个
温馨提示:这题时限 5s,如果你还卡不过去,那么请把 int 换成 short。
参考代码(C++17):
练习题 & 总结
Vizing 定理算是一个比较冷门的知识点,直到 SNOI2024 它才逐渐变得广为人知。该类型的练习题较少,这里有两道可供参考:
参考资料:
- 图的着色 - OI Wiki
- 本人题解:[SNOI2024] 拉丁方 题解 by
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理