杂题选讲 #1:二分图边着色

· 浏览次数 : 3

小编点评

Vizing定理是图论中一个重要的结果,它给出了对于一个简单无向图,其最大度数与边色数之间的关系。对于二分图,Vizing定理告诉我们最大度数等于边色数。 **证明** 证明二分图上的Vizing定理的充分性可以采用构造性证明。 1. **算法思想** 给定一个二分图$G=(V,E)$,其中$V$分为两个集合$U$和$V'$,每条边连接一个$U$中的顶点和一个$V$中的顶点。 遍历添加边,每次选择一个未使用的最小颜色对$(A,B)$来涂边$uv$,其中$u\in U$,$v\in V'$。 2. **存在性证明** 假设算法在添加边后不会产生冲突。我们可以观察到: - $u$不能与自己相连,因为它是二分图的一个顶点。 - $u$的每个邻居$v_1 \in V'$最多只能与$u$的颜色相同。 - 类似地,$v_1$的每个邻居$v_2 \in U$最多只能与$v_1$所在列的颜色相同。 - 以此类推,直到找到$v$的某个与$u$颜色不同的直接邻居或回溯到$u$的某个祖先。 如果存在这样一个未使用的颜色,则可以在后续步骤中使用它,并继续算法,不会有任何冲突。如果对所有未使用的颜色都无法使用,则说明当前添加的边会导致冲突。 3. **时间复杂度分析** 每次添加一条边最多需要检查与$u$相邻的所有顶点,因此总的时间复杂度为$O(mn)$,其中$n=|V|$,$m=|E|$。 **应用** 对于二分图的边染色问题,根据Vizing定理,可以得出以下结论: - 对于二分图中任意两个顶点$a,b$,它们的最大度数相等,即$\Delta(a)=\Delta(b)$。 - 对于二分图的一条边$(a,b)$,如果$a\in U$,则$\Delta(a)$与$b$所在的列的最大度数相等。 这种观察对于设计边着色算法十分有用,特别是对于那些需要确保某些约束满足的情况。

正文

Vizing 定理

定义

考虑如下的问题:对一个无向图的边进行着色,要求相邻的边染不同种颜色。问
需要的最少的颜色数是多少。

解决上述问题需要借助 Vizing 定理(又称维金定理)。

在开始之前,我们先进行一些符号的规定。

  • \(\Delta(G)\):无向图 \(G=(V,E)\) 的最大度数,即 \(\Delta(G)=\max_{i\in V}\deg i\)
  • \(\chi(G)\):若无向图 \(G\)\(k\) - 边可着色的,但不是 \((k-1)\) - 边可着色的,则称 \(\chi(G)\)\(G\) 的边色数,记为 \(\chi(G)\)

Vizing 定理的内容如下:

  • 对于简单无向图 \(G\),有 \(\Delta(G)\le\chi(G)\le\Delta(G)+1\)
  • 特别地,对于二分图 \(G\),有 \(\Delta(G)=\chi(G)\)

我们今天仅讨论后者的情况,即二分图的边着色。

证明

二分图上的 Vizing 定理为什么是正确的?

首先,必要性是显然的——不可能用比某个点的度数还少的颜
色数完成着色。

至于充分性,使用构造性证明。考虑执行如下算法:

对于二分图 \(G=(V,E)\),按顺序在二分图中加边。

加入一条边 \((u,v)\) 时,尝试寻找对于 \(u\)\(v\) 的编号最小且未使用过的颜色(你可以理解为 \(\mathrm{mex}\)),设为 \(A\)\(B\)

如果 \(A=B\),那么直接将这条边染上 \(A\)

否则令 \(A<B\),尝试将连接 \(v\) 的颜色为 \(A\) 的边的颜色强制改为 \(B\)

这样可能还会产生矛盾,假设这条边连接的另一个结点(设为 \(w\))上产生了矛盾,就把连接 \(w\) 的颜色为 \(B\) 的边的颜色再强制改为 \(A\)……

我们发现这是一个不断寻找增广路并对路径上的边交替染色的过程。

由于二分图不存在奇环,所以结点 \(u\) 不可能在增广路上,否则会与“最小未使用颜色为 \(A\)”矛盾。

时间复杂度 \(O(nm)\),其中 \(n=|V|\)\(m=|E|\)

模板题 CF600F

题意简述

构造出一组二分图边着色方案使得使用的颜色数最少。

数据范围:\(1\le n_1,n_2\le 1000\)\(1\le m\le 10^5\)

题目信息

来源:Codeforces

难度:\(\color{Red}\texttt{*2800}\)

正解

解法:完完全全的模板。实现时可以将其封装成一个类。

参考代码(C++17):

Submission #247875843 - Codeforces

[SNOI2024] 拉丁方

题意简述

定义一个 \(n \times n\) 的矩阵 \(A\) 为拉丁方,当且仅当每行每列都是一个 \(1 \sim n\) 的排列。

给定一个矩阵 \(A\) 左上角的一个 \(R \times C\) 的子矩阵,也就是 \(A_{i, j}\)\(1 \le i \le R\)\(1 \le j \le C\))。问能不能将剩下的位置填上数使得它是一个拉丁方。如果可以,构造出任意一组合法方案。

数据范围:多测,\(1\le T\le 5\)\(1\le R,C\le n\le 500\),输入的子矩阵不存在一行或者一列有两个相同的数。

题目信息

来源:陕西省 NOI 省队选拔赛 2024 D1T3

难度:\(\color{Darkblue}\texttt{NOI/NOI+/CTSC}\)

特殊性质 B:\(C=n\)

解法:从特殊性质 B 出发,可以观察到在这种情况下每一列要填哪些值都知道了,但是不知道每个值要填在哪一行。

于是考虑建出二分图,由未使用的值向列连边;因为要求同一行不能有相同的值,所以直接跑二分图边染色。

最终每条边的颜色即为该值在该列的行数。

可以证明这种情况下一定有解:此时对于每种颜色所有边构成了一组完美匹配。

正解

那么如何将上述做法扩展到 \(C\) 任意的情况?

考虑把原矩阵“补”成一个 \(C=n\) 的矩阵(就是把右上角那一块填上)再运用上述算法。仍然使用上面的做法,这次由值向行连边,然后每条边的颜色就是其所在的列。注意如果使用的颜色数 \(p\ne n-C\)(此时有点度数大于 \(n-C\))那么无解。

温馨提示:这题时限 5s,如果你还卡不过去,那么请把 int 换成 short。

参考代码(C++17):

提交记录 #335745 - QOJ.ac

练习题 & 总结

Vizing 定理算是一个比较冷门的知识点,直到 SNOI2024 它才逐渐变得广为人知。该类型的练习题较少,这里有两道可供参考:

参考资料:

与杂题选讲 #1:二分图边着色相似的内容:

杂题选讲 #1:二分图边着色

Vizing 定理 定义 考虑如下的问题:对一个无向图的边进行着色,要求相邻的边染不同种颜色。问 需要的最少的颜色数是多少。 解决上述问题需要借助 Vizing 定理(又称维金定理)。 在开始之前,我们先进行一些符号的规定。 \(\Delta(G)\):无向图 \(G=(V,E)\) 的最大度数,即

【WPF】根据选项值显示不同的编辑控件(使用DataTemplateSelector)

接了一个小杂毛项目,大概情形是这样的:ZWT先生开的店是卖拆片机的,Z先生不仅卖机器,还贴心地提供一项服务:可以根据顾客需要修改两个电机的转向和转速(机器厂家有给SDK的,但Z自己不会写程序)。厂家有配套一个调节器,调整参数时连接到拆片机的串口上,然后旋转按钮可以调速,拨码开关可以设定电机正转还是反

[转帖]【杂学第十二篇】oracledb_exporter监听oracle19c数据库出现libclntsh、ORA-12162、ORA-00942异常解决

http://www.taodudu.cc/news/show-4845374.html docker run -d --name oracledb_exporter --restart=always -p 9161:9161 -e DATA_SOURCE_NAME='sys/Test2013112

分享下最近基于Avalonia UI和MAUI写跨平台时间管理工具的体验

起因 几个月前,我在寻找一款时间管理软件,类似番茄时钟的工具,但是希望可以自定义时间。 需要自定义的场景 做雅思阅读,3篇文件需要严格控制时间分配,需要一个灵活的计时器 定期提醒,每30分钟需要喝水或者上个厕所或者摸一下鱼... 总结起来就是:专注一段时间,比如30分钟,然后休息10分钟,且没有杂七

[转帖]关于Bonree ONE 2.0,那些运维人不知道的一切

http://blog.itpub.net/31545813/viewspace-2924710/ 近年来,伴随着数字经济的不断深入,以云原生、Devops等为代表的新技术快速发展。传统的IT监控工具多样、分散、庞杂,并且数据种类杂、缺乏关联性,导致整个IT系统不具备真正的可观测性。那么,如何快速发