这是C#的实现,但概念也可用于Java。我使用邻接矩阵表示图形。检查图形中是否存在循环奇数周期。
如果图形存在一个分区(称为u和v),其中(u并集v)=Graph且(u交集v)=null,则称该图形为Bipartite Graph。
如果您考虑下面的图片,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可以形成另一个分区。因此,我们可以轻松地说这个图是二分图。如果同一级别的元素之间有红边怎么办?那么该图就不是二分图。如果您能修改BFS算法,我们可以实现这一点。
Here is the code for that.
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;
}