私は二部グラフを理解しようとしています。私の理解では、それは2つのサブグラフUとVに分割できるグラフGです。したがって、UとVの交差点はヌル集合であり、ユニオンはグラフGです。グラフが2部か、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
ここで必要なのは、このグラフが2部構成であるか、BFSを使用していないかを段階的に説明することです。
GeeksforGeeks から取得
以下は、Breadth First Search(BFS)を使用して、特定のグラフがBirpartiteであるかどうかを調べる簡単なアルゴリズムです。
2部グラフは、セット内の頂点が同じ色で色付けされるように2色を使用してグラフの色付けが可能な場合に可能です。
また、注:-
-> 2色を使用して、サイクルグラフを均等なサイクルで色付けすることができます。
->サイクルグラフを2つの色を使用して奇数サイクルで色付けすることはできません。
EDIT:-
グラフが接続されていない場合、(は複数のバイパーティションを持つことができます。上記のアルゴリズムを使用して、これらすべてのコンポーネントを個別にチェックする必要があります。
そのため、同じグラフの切断されたさまざまなサブグラフについては、上記で説明した同じアルゴリズムを使用して、それらすべてに対して個別にこの2分割チェックを実行する必要があります。それらのすべて同じグラフのさまざまな切断されたサブグラフは、独自のバイパーティションのセットを説明します。
そして、グラフはIFとONLY IFの二部と呼ばれ、その接続されたコンポーネントはそれぞれ二部であることが証明されます。
これがProlog CLP(FD)ソリューションです。グラフの各Edgeをドメイン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を使用することもできます。
カーネギーメロン大学から:
「グラフG =(V、E)は、頂点セットVを2つの互いに素なセットV1、V2に分割でき、EのすべてのエッジがV1に1つの端点を持ち、V2に1つの端点を持つ場合、2部と呼ばれることを思い出してください。
(ソース: http://www.cs.cmu.edu/~15251/homework/hw5.pdf )
BFSを使用する必要がありますか?二部グラフがサイクルの長さを検出する必要がある場合にグラフを決定し、DFSはおそらくBFSよりもサイクル検出に適しています。
とにかく、もしそれが奇数の長さのサイクルを持っていない場合にのみ、二部の場合のグラフ。 DFSの使用が許可されている場合は、グラフでDFSを実行し、バックエッジをチェックしてサイクルの存在を検出し、DFSタイムスタンプを使用して各サイクルのサイズを計算できます。
Bfs Treeを作成します。同じレベルのツリーの頂点間にエッジがある場合。グラフは2部ではありません。それ以外の場合は2部です。
以下のリンクを参照できます
このコードには、BFSアルゴリズムを使用して、特定のグラフが2部グラフかどうかのチェックが含まれます
https://github.com/gangwar-yogendra/Graph/blob/master/BipartiteGraphUsingBFS.c
以下は、グラフが2部からなるかどうかを確認するBFSのアプローチです。
c = 0
x
を選択し、x.class = c
を設定しますys
をBFS によって取得されたノードとするc = 1-c
y
in ys
set y.class = c
y
内のys
にz.class == c
を持つ隣接z
がある場合、グラフは二部ではありませんこれは、グラフが単一の接続されたコンポーネントであると仮定しています-そうでない場合は、各コンポーネントに対してこの手順を実行します。