如何查找图表是否为二分图?

时间:2015-05-27 15:26:15

标签: algorithm data-structures graph graph-algorithm bipartite

我一直试图了解二分图。据我所知,它是一个图G,它可以分为两个子图U和V.So U和V的交集是一个空集,union是图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的双金属。

7 个答案:

答案 0 :(得分:26)

取自GeeksforGeeks

以下是使用广度优先搜索(BFS)查明给定图表是否为Birpartite的简单算法: -

  1. 将红色分配给源顶点(放入设置U)。
  2. 用蓝色为所有邻居着色(放入第V组)。
  3. 用红色为所有邻居的邻居着色(放入设置U)。
  4. 这样,为所有顶点指定颜色,使其满足m方式着色问题的所有约束,其中m = 2。
  5. 在分配颜色时,如果我们找到的颜色与当前顶点颜色相同的邻居,则图形不能用2个顶点着色(或图形不是Bipartite)。
  6.   

    如果可以使用图表着色,则可以使用二分图   两种颜色,使得一组中的顶点用相同的颜色着色   颜色。

    此外, 注: -

    - >可以使用两种颜色对均匀循环的循环图进行着色。

    - >无法使用两种颜色为具有奇数周期的循环图着色。

    编辑: -

    如果未连接图表, 可能 具有多个二分图。您需要使用上面提到的算法单独检查所有这些组件。

    因此,对于同一图形的各种断开连接的子图,您需要使用上面讨论的相同算法分别对所有这些子图进行二分检查。所有这些相同图表的各种断开连接的子图将考虑其自己的二分组。

    并且,图表将被称为二分,IF和ONLY IF,其每个连接组件都被证明是二分的。

答案 1 :(得分:2)

来自卡内基梅隆大学:

  

“回想一下,图表G =(V,E)被认为是二分的   如果它的顶点集合V可以被划分为两个不相交的集合V1,V2,那么E中的所有边缘在V1中有一个端点,在V2中有一个端点。

(来源:http://www.cs.cmu.edu/~15251/homework/hw5.pdf

您确定需要使用BFS吗?确定二分图是否需要检测周期长度,并且DFS可能比BFS更适合于周期检测。

无论如何,如果且仅当它没有奇数长度的循环时,是否为二分图。如果允许使用DFS,则可以在图形上进行DFS并检查后沿以检测周期的存在,并使用DFS时间戳来计算每个周期的大小。

答案 2 :(得分:2)

这是Prolog CLP(FD)解决方案。只需将图中的每条边建模为域0..1中的变量。然后将每个顶点建模为等式:

X #\= Y.

然后发出标签。如果标签找到了解决方案,那么您就完成了。它可能会找到多种解决方案。以下是您的示例:

Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.23)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam

:- use_module(library(clpfd)).
problem(L) :- L=[A,B,C,D,E,F,G],
    A #\= E, A #\= F,
    B #\= E,
    C #\= E, C #\= F, C #\= H,
    D #\= G, D #\= H,
    E #\= A, E #\= B, E #\= C,
    F #\= A, F #\= C, F #\= G,
    G #\= F, G #\= D,
    H #\= C, H #\= D.

?- problem(L), L ins 0..1, label(L).
L = [0, 0, 0, 1, 1, 1, 0] ;
L = [1, 1, 1, 0, 0, 0, 1].

也可以在GNU Prolog,SICStus Prolog,Jekejeke Minlog等中使用..主要是使用任何实现CLP(FD)的Prolog系统。或者也可以使用CLP(B)或dif / 2。

答案 3 :(得分:1)

创建一个bfs Tree。如果在同一级别的树的顶点之间有边。那么图是非二分的,否则它是二分的。

答案 4 :(得分:0)

以下是检查图表是否为二分的BFS方法。

  • c = 0
  • 选择一个节点x并设置x.class = c
  • ys成为BFS获取的节点
    • c = 1-c
    • {li> for y ysy.class = c
    • 如果y中的任何ysz的邻居z.class == c,那么该图表不是二分的
    • 重复,直到找不到更多节点
  • 图表是二分的

这假设图是一个连通的组件 - 如果不是,只需对每个组件执行此过程。

答案 5 :(得分:0)

您可以参考以下给出的链接 此代码包含使用BFS算法检查给定图形是否为Bipartite https://github.com/gangwar-yogendra/Graph/blob/master/BipartiteGraphUsingBFS.c

答案 6 :(得分:-1)

做得更简单。

运行强连接组件算法。

如果获得的元图的任何节点有两个以上的顶点,那么给定的图不是二分的。