web-dev-qa-db-ja.com

グラフが二部であるかどうかを調べる方法は?

私は二部グラフを理解しようとしています。私の理解では、それは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を使用していないかを段階的に説明することです。

16
user2738777

GeeksforGeeks から取得

以下は、Breadth First Search(BFS)を使用して、特定のグラフがBirpartiteであるかどうかを調べる簡単なアルゴリズムです。

  1. ソース頂点にREDカラーを割り当てます(セットUに入れます)。
  2. すべての隣人を青で色付けします(セットVに入れます)。
  3. すべての隣人の隣人を赤で色付けします(セットUに入れます)。
  4. この方法で、すべての頂点に色を割り当てて、m = 2の場合のmウェイカラーリング問題のすべての制約を満たします。
  5. 色の割り当て中に、現在の頂点と同じ色で色付けされた近傍を見つけた場合、グラフを2つの頂点で色付けすることはできません(またはグラフは2部ではありません)。

2部グラフは、セット内の頂点が同じ色で色付けされるように2色を使用してグラフの色付けが可能な場合に可能です。

また、注:-

-> 2色を使用して、サイクルグラフを均等なサイクルで色付けすることができます。

->サイクルグラフを2つの色を使用して奇数サイクルで色付けすることはできません。

EDIT:-

グラフが接続されていない場合、は複数のバイパーティションを持つことができます。上記のアルゴリズムを使用して、これらすべてのコンポーネントを個別にチェックする必要があります。

そのため、同じグラフの切断されたさまざまなサブグラフについては、上記で説明した同じアルゴリズムを使用して、それらすべてに対して個別にこの2分割チェックを実行する必要があります。それらのすべて同じグラフのさまざまな切断されたサブグラフは、独自のバイパーティションのセットを説明します。

そして、グラフはIFとONLY IFの二部と呼ばれ、その接続されたコンポーネントはそれぞれ二部であることが証明されます。

29
Am_I_Helpful

これが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を使用することもできます。

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タイムスタンプを使用して各サイクルのサイズを計算できます。

2
Xceptional

Bfs Treeを作成します。同じレベルのツリーの頂点間にエッジがある場合。グラフは2部ではありません。それ以外の場合は2部です。

1
ashu beckham

以下のリンクを参照できます
このコードには、BFSアルゴリズムを使用して、特定のグラフが2部グラフかどうかのチェックが含まれます
https://github.com/gangwar-yogendra/Graph/blob/master/BipartiteGraphUsingBFS.c

0
Yogendra Kumar

以下は、グラフが2部からなるかどうかを確認するBFSのアプローチです。

  • c = 0
  • ノードxを選択し、x.class = cを設定します
  • ysをBFS によって取得されたノードとする
    • c = 1-c
    • y in ys set y.class = c
    • y内のysz.class == cを持つ隣接zがある場合、グラフは二部ではありません
    • ノードが見つからなくなるまで繰り返します
  • グラフは二部です

これは、グラフが単一の接続されたコンポーネントであると仮定しています-そうでない場合は、各コンポーネントに対してこの手順を実行します。

0
mitchus