二分图问题

一、问题描述

  给定一个具有n个顶点的图,要给图上每个顶点染色并且要使相邻的顶点的颜色不同,问是否最多用2种颜色进行染色?没有重边和自环。把相邻顶点染成不同颜色的问题叫做图的着色问题。对图进行染色所需的最小颜色数,称为最小着色数。最小着色数为2的图称为二分图,如下图所示就是一个二分图。下面代码是用来判断是否二分图。

  

二、思路

  直接DFS即可,要注意代码里面的一些细节。

三、代码

 1 public class 图的着色_二分图 {
 2     static boolean dfs(MyNode node, int c) {
 3         node.color = c;// 同时标记已访问和具体颜色
 4         for (int i = 0; i < node.size(); i++) {// 遍历所有neighbor
 5             MyNode neighbor = (MyNode) node.getNeighbor(i);// 具体的neighbor
 6             // 如果相邻节点颜色一样,返回false
 7             if (neighbor.color == c)
 8                 return false;
 9             // 没有被染色,就染不同颜色进行递归
10             if (neighbor.color == 0) {
11                 boolean res = dfs(neighbor, -c);
12                 if (!res)
13                     return false;
14             }
15         }
16         return true;
17     }
18 
19     public static void main(String[] args) {
20         // 下面的数据表示的就是上面的图
21         MyNode n1 = new MyNode(1);
22         MyNode n2 = new MyNode(2);
23         MyNode n3 = new MyNode(3);
24         MyNode n4 = new MyNode(4);
25 
26         n1.add(n2);
27         n1.add(n4);
28 
29         n2.add(n1);
30         n2.add(n3);
31 
32         n3.add(n2);
33         n3.add(n4);
34 
35         n4.add(n1);
36         n4.add(n3);
37 
38         // 任意顶点都可以
39         System.out.println(dfs(n1, 1));  // 输出 true
40     }
41 
42     // GraphNode_AL这个类在前面博客  邻接表表示图
43     static class MyNode extends GraphNode_AL {
44         int color;
45 
46         public MyNode(int val) {
47             super(val);
48         }
49 
50         public MyNode(int val, int color) {
51             super(val);
52             this.color = color;
53         }
54     }
55 }

 

posted @ 2019-02-21 17:55  |旧市拾荒|  阅读(326)  评论(0编辑  收藏  举报