-
二分图(Bipartite Graph)是一种图,其中节点可以划分为两个互不相交的集合,使得每条边连接着一个属于第一个集合的节点和一个属于第二个集合的节点。
- 判别二分图:
-
染色法(O(m+n)):
- 基本思路:通过给图中的顶点进行染色,判断是否存在颜色冲突。如果不存在冲突,则图是二分图。
- 算法步骤:
- 初始化一个空的颜色数组,用于记录每个顶点的染色情况。颜色分为两种,一般用0和1表示。
- 从任意一个未染色的顶点开始进行染色,将其染成颜色0。
- 遍历图中的所有顶点,对每个顶点进行如下操作:
- 如果当前顶点已经被染色,则跳过。
- 对当前顶点的所有邻接顶点进行染色,如果染色冲突(即邻接顶点与当前顶点的颜色相同),则判定为非二分图。
- 如果遍历完所有顶点后没有发现颜色冲突,则判定为二分图。
-
匈牙利算法(O(mn)):
- 基本思路:通过匹配顶点和边的方式判断是否为二分图。匈牙利算法是求最大匹配的经典算法之一。
- 算法步骤:
- 初始化一个空的匹配数组,用于记录每个顶点的匹配情况。
- 遍历图中的所有顶点,对每个顶点进行如下操作:
- 如果当前顶点已经被匹配,则跳过。
- 尝试将当前顶点与未匹配的邻接顶点进行匹配,如果匹配成功,则继续寻找下一个未匹配的顶点进行匹配。
- 统计匹配成功的顶点数量,如果与图中顶点数相等,则判定为二分图。
-
- 判别二分图: