これは C# の実装ですが、この概念は Java でも使用できます。グラフを表すために Adjacency Matrix を使用しました。グラフに奇数のサイクルがあるかどうかを確認します。
1,2,3,4,5,6の下の図を考慮すると、そのグラフにパーティションが存在する場合、グラフは二部と呼ばれます。 ,7 はグラフ G の頂点です。左側 (1,4,5,6) の頂点を U、右側 (2,3,7) の頂点を V と考えてみましょう。
現時点では、グラフに赤い接続がないことを考慮してください。無向グラフとして、u から v および v から u への接続があることがわかります。しかし、パーティションには接続がありません。それが私が使用するコンセプトです。

以下に示すグラフは、ツリー構造のように描かれていることを除いて、上記と同じグラフであると考えてください。この場合、代替レベル 1、3、5 に存在するノードを見ることができれば、一緒にパーティションを形成でき、2、4 が別のパーティションを形成できます。したがって、グラフは BiPartite であると簡単に言えます。同じレベルの要素間に赤い縁がある場合はどうなりますか? グラフは 2 部構成ではありません。BFS アルゴリズムを変更できる場合は、これを実現できます。

これがそのコードです。
int[,] BPGraph = new int[7,7]{
{0,1,0,1,0,0,0},
{1,0,1,0,1,1,0},
{0,1,0,1,0,0,1},
{1,0,1,0,1,1,0},
{0,1,0,1,0,0,1},
{0,1,0,1,0,0,1},
{0,0,1,0,1,1,0}
};
int[] BPArray = new int[7] { 0, 0, 0, 0, 0, 0, 0 };
public Boolean BiPartite()
{
Queue<int> VertexQueue = new Queue<int>();
int level = 0;
int nextlevel=0;
Boolean BPFlg = true;
VertexQueue.Enqueue(0);
while(VertexQueue.Count!=0)
{
int current = VertexQueue.Dequeue();
level = BPArray[current];
if (level == 0)
level = 1;
if (level == 2)
nextlevel=1;
else
nextlevel=2;
if(BPArray[current]==0)
BPArray[current] = level;
for (int i = 0; i < 7; i++)
{
if (BPGraph[current, i] == 1)
{
if (BPArray[i] == 0)
{
BPArray[i] = nextlevel;
VertexQueue.Enqueue(i);
}
else if (BPArray[i] == level)
{
BPFlg = false;
break;
}
}
}
if (!BPFlg)
break;
}
return BPFlg;
}