algorithm - 如何判断一个图是否是二分图?

标签 algorithm data-structures graph graph-algorithm bipartite

我一直在努力理解二分图。据我了解,它是一个图 G,可以分为两个子图 U 和 V。因此 U 和 V 的交集是一个空集,并集是图 G。 我正在尝试使用 BFS 查找图是否是二分图。我仍然不清楚我们如何使用 BFS 找到它。

假设我们有如下定义的图形。

a:e,f
b:e
c:e,f,h
d:g,h
e:a,b,c
f:a,c,g
g:f,d
h:c,d

我在这里需要的是逐步解释这个图如何是二分图或不使用 BFS。

最佳答案

取自GeeksforGeeks

以下是使用广度优先搜索 (BFS) 确定给定图是否为二分图的简单算法:-

  1. 将红色分配给源顶点(放入集合 U)。
  2. 用蓝色给所有的邻居上色(放入集合 V)。
  3. 用红色给所有邻居的邻居着色(放入集合 U)。
  4. 这样,将颜色分配给所有顶点,使其满足 m 路着色问题的所有约束条件,其中 m = 2。
  5. 在分配颜色时,如果我们找到一个与当前顶点颜色相同的邻居,则该图不能用 2 个顶点着色(或者图不是二分图)。

A bipartite graph is possible if the graph coloring is possible using two colors such that vertices in a set are colored with the same color.

此外,注意:-

-> 可以使用两种颜色为具有偶数循环的循环图着色。

-> 用两种颜色给奇数圈的圈图上色是不可能的。

编辑:-

如果一个图没有连接,它可能有多个二分图。您需要使用上述算法分别检查所有这些组件。

因此,对于同一图的各种断开连接的子图,您需要使用上面讨论的相同算法分别对所有子图执行此二分检查。所有那些同一个图的各种断开连接的子图将解释它自己的一组二分图。

并且,该图将被称为二分图,当且仅当,其连接的每个分量都被证明是二分的。

关于algorithm - 如何判断一个图是否是二分图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30486784/

相关文章:

perl - 如何摆脱 Perl 的 GD::Graph 中的饼图轮廓?

algorithm - 为什么不使用替代元素作为跳过列表中的垂直搜索节点?

algorithm - 这个算法的名字是什么?

c# - 将 trie 保存到磁盘

c - 为什么高效的堆构建需要随机访问?

recursion - Graphviz (xdot) : How to make recursive nodes?

c# - 如何遍历具有多个分支的树

algorithm - 生成摊销时间表

haskell - 在实现 Birdson 的泊松盘分布时使用哪种数据结构

java - 无法使用 Dijkstra 算法找到最短路径?