分享一个自己写的二分图检测算法

来源:4-10 二分图检测

软件工程小白菜

2019-08-14

因为不确定二分图检测算法是否能运用在不连通的图上,所以这里假设图是连通的。我的实现思路是将开辟一个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;
   }
}

写回答

1回答

仙女座舜

2019-08-15

   0

/     \

1     2        这个是一颗最简单的只有三个结点的二叉树(无环图) 可以把0看成一边 ,1和2看成一边。0和2差的是偶数但这个无环图也是一颗二分图。所以不能用相邻点差值的奇偶性判断一个图是不是二分图

0
2
liuyubobobo
大赞!感谢分享:)
2019-08-15
共2条回复

玩转算法系列--图论精讲(Java版)

30+小时系统学习,bobo带你克服被图论支配的恐惧

1591 学习 · 324 问题

查看课程