• 二分图问题


    一、问题描述

      给定一个具有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 }
  • 相关阅读:
    将网址设为首页和添加到收藏夹(JS脚本)
    窗体居中一句话
    链接跳转JS
    工厂学习心得(三)Asp.net
    工厂模型学习心得(一)(ASP.Net)
    ubuntu终端快捷键
    Win7锐捷:无法找到网卡或系统未完成网卡初始化操作.请稍后再尝试认证
    Xming的使用
    在Windows上建立ssh服务器
    Windows XP循环启动
  • 原文地址:https://www.cnblogs.com/xiaoyh/p/10414277.html
Copyright © 2020-2023  润新知