Это реализация c #, но эта концепция может быть использована и в Java.Я использовал матрицу смежности для представления графика.Проверка, существует ли цикл в графе нечетный цикл.
График называется двудольным, если в этом графе существует разбиение, скажем, u и v, где (u union v) = Graph и (u пересечение v)= null, если вы считаете, что на картинке ниже 1,2,3,4,5,6,7 - вершины графа G. Давайте рассмотрим вершины слева (1,4,5,6) как U и насправа (2,3,7) как V
Учтите, что на графике пока нет красной связи.Вы можете видеть, что существует связь между u и v, а v - как ненаправленный граф.но в разделе нет связи с.Это концепция, которую я собираюсь использовать.
![enter image description here](https://i.stack.imgur.com/ieerj.png)
Рассмотрим график, показанный ниже, и тот же график выше, за исключением того, что он нарисован больше как древовидная структура.В этом случае, если вы видите узлы, присутствующие на альтернативных уровнях, 1,3,5 могут вместе образовать раздел, а 2,4 - другой раздел.Таким образом, мы могли бы легко сказать, что график BiPartite.Что делать, если между элементами на одном уровне есть красный край?тогда график не является двудольным. Если вы можете изменить алгоритм BFS, мы можем достичь этого.
![enter image description here](https://i.stack.imgur.com/3jQLb.png)
Вот код для этого.
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;
}