这是 c# 实现,但这个概念也可以在 Java 中使用。我使用邻接矩阵来表示图形。检查图中是否有一个循环奇数循环。
如果您考虑下图 1,2,3,4,5,6,则如果该图中存在分区说 u 和 v 其中 (u union v) = Graph 并且 (u intersection v) = null ,则该图称为 Bipartite ,7 是图 G 中的顶点。让我们将左侧 (1,4,5,6) 的顶点视为 U,将右侧 (2,3,7) 的顶点视为 V
考虑现在图表中没有红色连接。您可以看到从 u 到 v 和从 v 到 u 的连接是一个无向图。但在分区中没有任何联系。这就是我要使用的概念。
考虑如下所示的图表,它与上面的图表相同,只是它的绘制更像树形结构。在这种情况下,如果您可以看到交替级别上存在的节点 1、3、5 可以一起形成一个分区,而 2,4 可以形成另一个分区。所以我们可以很容易地说这个图是 BiPartite。如果同一级别的元素之间存在红边怎么办?那么图不是二分图。如果你可以修改 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;
}