zoukankan      html  css  js  c++  java
  • 二分图问题

    一、问题描述

      给定一个具有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 }
  • 相关阅读:
    Maven导入com.google.common.collect jar包
    poj 2192 Zipper
    poj 3278 Catch That Cow
    poj 2488 A Knight's Journey
    poj 3982 序列
    poj 2109 Power of Cryptography
    poj 3258 3273
    java中大数的一些基本运算
    hdu 1715 大菲波数
    最小生成树模板
  • 原文地址:https://www.cnblogs.com/xiaoyh/p/10414277.html
Copyright © 2011-2022 走看看