たとえば、グラフG =(V、E)があるとします。
V = {A、B、C、D}
E = {(A、B)、(A、D)、(C、D)}
このグラフは2部グラフであるため、2つの互いに素なセット{A、C}と{B、D}に分割できます。私の最初の推測は、グラフを歩き、各頂点に交互の色を割り当てることができるということです。これは事実ですか、それともこれよりも複雑/単純ですか?このための既知のアルゴリズムはありますか?
たとえば、グラフG =(V、E)があるとします。
V = {A、B、C、D}
E = {(A、B)、(A、D)、(C、D)}
このグラフは2部グラフであるため、2つの互いに素なセット{A、C}と{B、D}に分割できます。私の最初の推測は、グラフを歩き、各頂点に交互の色を割り当てることができるということです。これは事実ですか、それともこれよりも複雑/単純ですか?このための既知のアルゴリズムはありますか?
あなたの最初の推測は正しいです-グラフをトラバースして交互に。
アルゴリズムは単純でなければなりません。各色に1つずつ、訪問するノードの2つのキューを保持します。ノードをキューから交互にポップし、その色をマークし、訪問していない隣接ノードを反対の色でキューにプッシュします。訪問したノードの数+両方のキューの長さ=グラフ内のノードの数で終了します。
グラフをトラバースして交互に表示します。成功しない場合は、グラフが2部グラフではないことを意味します。
ウィキペディアから ( http://en.wikipedia.org/wiki/Bipartite_graph )
二部グラフが接続されている場合、その二分割は、任意に選択された頂点 v からの距離のパリティによって定義できます。一方のサブセットは、v までの距離が偶数の頂点で構成され、もう一方のサブセットは、v から奇数の距離にある頂点で構成されます。
したがって、このパリティ手法を使用して、グラフの各接続コンポーネント内で別々に 2 つのサブセット U と V に頂点を割り当てることにより、グラフが 2 部であるかどうかを効率的にテストし、次に各エッジを調べて、異なるエッジに割り当てられた端点があることを確認できます。サブセット。
グラフが2分割されていることが確実な場合は、次のように、各頂点をトラバースするために色を交互に割り当てることができます。
グラフは、2色である場合に限り、2部グラフになります。
グラフ描画ツールに実装しました。私のコードを JavaScript で見ることができます。
最初の頂点を左パーティとしてマークし、再帰的にその隣人を右パーティとしてマークし、再帰的にその隣人を左パーティとしてマークしました...正しくマークされたノードが見つかったら、このブランチの再帰を停止します。正しくマークされていないノードが見つかった場合、グラフは 2 部構成ではありません。
もっと簡単にできるかもしれませんが、ここ数か月、Prolog と Haskell のコーディングに苦労しました。脳に影響を与えたのかもしれませんが、今ではすべてに再帰が見られます :-D
誰かが興味を持っている場合に備えて、私が思いついたコードは次のとおりです。
def dfs(root, colorings):
to_visit1 = deque()
to_visit2 = deque()
to_visit1.append(root)
while len(to_visit1) != 0 or len(to_visit2) != 0:
dfs_color(to_visit1, to_visit2, True, colorings)
dfs_color(to_visit2, to_visit1, False, colorings)
def dfs_color(queue, opposite_queue, color, colorings):
while len(queue) != 0:
v = queue.pop()
if v in adjacency_list:
colorings[v] = color
neighbors = adjacency_list[v]
del adjacency_list[v]
for neighbor in neighbors:
opposite_queue.append(neighbor)
確かに、これは私の最高のコードではありません。True
色に/を使っているFalse
のは、再帰を使うと と言いやすくなったからnot color
です。もちろん、より大きなグラフでスタックを吹き飛ばしたため、変更する必要がありました。また、当然のことながら、このコードはDFSのウィキペディア コードに基づいています。
指摘されているように、これは単に偽装された BFS である可能性があると思います。