因为不确定二分图检测算法是否能运用在不连通的图上,所以这里假设图是连通的。我的实现思路是将开辟一个int型的颜色数组,所有值初始化为-1,代表没有访问过,之后从0开始,将1,2,3,4..传入数组。此时,如果偶数0,2,4,6代表一种颜色,则奇数1,3,5,7代表另一种颜色。此时判断两个顶点的颜色是否不同,只需要判断他们的差值是不是奇数即可。
public class SelfDoneBipartitionDetection {
private Graph G;
private int[] color; // 颜色数组
private boolean isBinary;
private int mark; // 标记颜色
public SelfDoneBipartitionDetection(Graph G){
this.G = G;
isBinary = true;
color = new int[G.V()];
mark = 0;
for(int i=0; i<color.length; i++){
color[i] = -1;
}
dfs(0);
}
private void dfs(int v){
//System.out.println("v is " + v + ". and mark is " + mark);
color[v] = mark;
for(int w: G.adj(v)){
if(color[w] == -1){
mark++;
dfs(w);
}
else{
if(Math.abs((color[v] - color[w]) % 2) != 1){
isBinary = false;
}
}
}
}
public boolean isBinary(){
return isBinary;
}
}