本文主要是介绍关于二分图染色的几点总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
二分图染色的概念:
- 二分图染色是一种用来判断给定图(有向图或无向图)是否是二分图的算法。
- 在图上不断进行BFS或DFS,并在运行过程中不断对结点进行"染色","染色"保证相邻结点的颜色必然不同。如果无法保证,则这个图就是二分图.
二分图染色时的注意事项:
- 二分图染色的题常会结合DP进行考察,因此往往要注意推理状态转移方程
- 二分图染色类型的题目也有可能结合类似DAG上的推论这种图上定理进行考察,这就要求对图论有一定的掌握。特别需要注意非联通图的情况.
二分图染色的例题(难度由低到高):
- CF862B Mahmoud and Ehab and the bipartiteness(普及 提高-)
- P1330 封锁阳光大学(普及+ 提高)
- P1525 关押罪犯(普及+ 提高)
- P1155 双栈排序(提高+ 省选-)
二分图染色的适用范围:
- 只要是图即可.
判断一个图是二分图的充分条件:
- 图上没有边数为奇数的环.
关于二分图染色的总结:
- 染色性:在算法的运行的过程中,会不断对结点进行标记,也就是染色。在二分图染色算法中,结点往往只会被染成两种染色,在这种情况下,我们往往可以使用两个特定的数字,如:1或0来进行染色(因为可以直接使用^运算符,存储数据的数组初始化为-1即可).
- 遍历性:在二分图染色的过程中,会经过图上的每一个点。在这一点上,她和其他图上算法是有着较大的相似性的(如:Kruskal,Dijkstra,拓扑排序)。但是,这一条性质也不是一定要满足的。在上面我们已经知道,判断一个图是二分图的充分条件是图上没有边数为奇数的环,如果以这个条件为判断依据,可能不需要遍历所有点(在一般情况下常常使用BFS或DFS算法遍历所有点).
- 简单性:在二分图染色的常见实现中,最常见的实现方法往往就是DFS或BFS染色的方法了。也因为她"易于实现"的特性,在实际实践中,二分图染色可能是比较容易想到的一部分,但也是比较重要的一部分.
- 数学性质:由于判断一个图是否为二分图的充分条件中,我们的判断依据与边的"数量"有关,因此,在一些情况下,我们应该是可以通过图上的边数或边的特性来推理这个图是否为二分图(如:DAG必然为二分图).
- 二分性:在遇到一些需要将一些对象分成两个不同的部分的情况时,可以考虑使用二分图染色判断是否为二分图,就能得到一个与解相关的结论:该问题是否可解.
这篇关于关于二分图染色的几点总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!