我一直试图了解二分图。据我所知,它是一个图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的双金属。
答案 0 :(得分:26)
以下是使用广度优先搜索(BFS)查明给定图表是否为Birpartite的简单算法: -
如果可以使用图表着色,则可以使用二分图 两种颜色,使得一组中的顶点用相同的颜色着色 颜色。
此外, 注: -
- >可以使用两种颜色对均匀循环的循环图进行着色。
- >无法使用两种颜色为具有奇数周期的循环图着色。
编辑: -
如果未连接图表, 可能 具有多个二分图。您需要使用上面提到的算法单独检查所有这些组件。
因此,对于同一图形的各种断开连接的子图,您需要使用上面讨论的相同算法分别对所有这些子图进行二分检查。所有这些相同图表的各种断开连接的子图将考虑其自己的二分组。
并且,图表将被称为二分,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
y
ys
集y.class = c
y
中的任何ys
有z
的邻居z.class == c
,那么该图表不是二分的这假设图是一个连通的组件 - 如果不是,只需对每个组件执行此过程。
答案 5 :(得分:0)
您可以参考以下给出的链接 此代码包含使用BFS算法检查给定图形是否为Bipartite https://github.com/gangwar-yogendra/Graph/blob/master/BipartiteGraphUsingBFS.c
答案 6 :(得分:-1)
做得更简单。
运行强连接组件算法。
如果获得的元图的任何节点有两个以上的顶点,那么给定的图不是二分的。