日撸 Java 三百行day35

这篇具有很好参考价值的文章主要介绍了日撸 Java 三百行day35。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客
自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/sampledata

day35 图的 m 着色问题

1.问题描述

给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法

2.思路

分析:
设M[i]= x(x= 0,1,2,…m ; i = 0,1,2,…n)代表第i节点的颜色x; m=3,n = 3,按理颜色的组合会有m^n
以下图为例,组合会有3^3 = 27种,但是不是所有都可以,有黄色代表冲突
日撸 Java 三百行day35

  • M[0] = 0,M[1]={0,1,2}, M[2]={0,1,2} 进行颜色排列组合{0,1,1},{0,1,2},{0,2,1},{0,2,2}
  • M[0] = 1, M[2]={0,1,2},M[2]={0,1,2}进行颜色排列组合{1,0,0},{1,0,2},{1,2,0},{1,2,2}
  • M[0] = 2, M[2]={0,1,2},M[2]={0,1,2}进行颜色排列组合{2,0,0},{2,0,1},{2,1,0},{2,1,1}
    在图的着色过程中,我们需要判断是否是邻接点以及颜色是否冲突
    其中也有递归的思想在里面,例如我确定了0节点的颜色,我去判断剩下其他节点的颜色。在1,2节点颜色,我确定了1节点颜色,又去判断3节点的颜色。
    通过上面的图,画出这个图的空间树去理解还蛮好理解的(其实也思考理解了好久)
    日撸 Java 三百行day35

2.代码

  • 在前面的分析中有提到递归的思想,所以我们结合上面的解空间树(树我们会常常用到递归),我们为结点0着色后,为其下一个结点着色时如1结点,则需要判断他们是否是相邻节点?是否颜色是不同的?若都满足又往深的递归,若不满足则回溯结点。我觉得图着色问题主要思想也在这里。
   public void coloring(int paraNumColors) {
        int tempNumNodes = connectivityMatrix.getRows();
        int[] tempColorScheme = new int[tempNumNodes];
        Arrays.fill(tempColorScheme, -1);


        coloring(paraNumColors, 0, tempColorScheme);
    }

    public void coloring(int paraNumColors, int paraCurrentNumNodes, int[] paraCurrentColoring) {
        // Step 1. Initialize.
        int tempNumNodes = connectivityMatrix.getRows();

        System.out.println("coloring: paraNumColors = " + paraNumColors + ", paraCurrentNumNodes = "
                + paraCurrentNumNodes + ", paraCurrentColoring" + Arrays.toString(paraCurrentColoring));
        // A complete scheme.
        if (paraCurrentNumNodes >= tempNumNodes) {
            System.out.println("Find one:" + Arrays.toString(paraCurrentColoring));
            return;
        }

        // Try all possible colors.
        for (int i = 0; i < paraNumColors; i++) {
            paraCurrentColoring[paraCurrentNumNodes] = i;
            if (!colorConflict(paraCurrentNumNodes + 1, paraCurrentColoring)) {
                coloring(paraNumColors, paraCurrentNumNodes + 1, paraCurrentColoring);
            }
        }
    }

    public boolean colorConflict(int paraCurrentNumNodes, int[] paraColoring) {
        for (int i = 0; i < paraCurrentNumNodes - 1; i++) {
            // No direct connection.
            if (connectivityMatrix.getValue(paraCurrentNumNodes - 1, i) == 0) {
                continue;
            }

            if (paraColoring[paraCurrentNumNodes - 1] == paraColoring[i]) {
                return true;
            }
        }
        return false;
    }

    public static void coloringTest() {
        //int[][] tempMatrix = { { 0, 1, 1, 0 }, { 1, 0, 0, 1 }, { 1, 0, 0, 0 }, { 0, 1, 0, 0 } };
        int[][] tempMatrix = { { 0, 1, 1}, { 1, 0, 0 }, { 1, 0, 0 }};
        Graph tempGraph = new Graph(tempMatrix);
        //tempGraph.coloring(2);
        tempGraph.coloring(3);
    }

  • 测试的例子为上面分析中的例子。
    日撸 Java 三百行day35

日撸 Java 三百行day35文章来源地址https://www.toymoban.com/news/detail-420909.html

到了这里,关于日撸 Java 三百行day35的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python版day35

    860. 柠檬水找零 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元

    2024年02月12日
    浏览(28)
  • 前端实习day35

    今天是下早班的一天,下完班直接赶车回广州了,吐槽一下深圳站管理得真得差,候车厅小,人巨多,而且进站口的标识也很少,绕了好久才找到!下次再也不去了。 今天是改bug的一天,但是有半天后端接口都不难用,所以就在刷掘金文章,学习学习技术,下面是一些总结资

    2024年02月11日
    浏览(40)
  • 【linux】:老师问什么是爱情,我说了句:软硬链接和动静态库

        文章目录 前言 一、软硬链接 二、动态库和静态库 总结   上一篇文章的最后我们讲解了文件的inode,那么文件名和inode有什么区别呢?区别就在于linux系统只认inode号,文件的inode属性中,并不存在文件名,而文件名其实是给用户用的。我们以前讲过linux文件目录,那么目

    2023年04月19日
    浏览(132)
  • java黑马头条 day5自媒体文章审核 敏感词过滤算法DFA 集成RabbitMQ实现自动审核

      做为内容类产品,内容安全非常重要,所以需要进行对自媒体用户发布的文章进行审核以后才能到app端展示给用户。2 WmNews 中 status 代表自媒体文章的状态 status字段:0 草稿 1 待审核 2 审核失败 3 人工审核 4 人工审核通过   8 审核通过(待发布) 9 已发布 当自媒体用户提交

    2024年02月06日
    浏览(41)
  • day35-Postman/ajax

    1.postman 2.ajax                                                                                      1.Postman 1.1  定义:postman用于测试http协议接口,无论是开发还是测试人员 1.2  Servlet 中的doGet()/doPost() (1)创建servlet,配置we

    2024年02月16日
    浏览(30)
  • 【代码随想录】刷题Day35

    860. 柠檬水找零 1.如果第一个顾客没有五元,那么直接返回false,因为店主开始没有零钱 2.定义两个int,一个记录5元,一个记录10元,随后遍历整个数组,会出现三种情况: 如果顾客给5元,直接num5加一 如果顾客给10元,判断num5是否大于0,大于则num5--,num10++;反之返回false

    2024年02月06日
    浏览(40)
  • 代码随想录二刷day35

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

    2024年02月07日
    浏览(66)
  • DAY 35 sed文本编辑器

    文本三剑客:都是按行读取后处理。 grep 过滤行内容 awk 过滤字段 sed 过滤行内容;修改行内容 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流 sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存

    2023年04月19日
    浏览(43)
  • 跟着pink老师前端入门教程-day03

    6.1 表格的主要作用 主要用于 显示、展示数据 ,可以让数据显示的规整,可读性非常好,特别是后台展示数据时,能够熟练运用表格就显得很重要。 6.2 基本语法 6.3 表头单元格标签 一般表头单元格位于表格的 第一行或第一列 ,表头单元格里面的 文本内容加粗居中显示 ,突

    2024年01月18日
    浏览(46)
  • 跟着pink老师前端入门教程(JavaScript)-day02

    1、什么是变量 白话:变量就是一个装东西的盒子 通俗:变量是用于存储数据的‘ 容器 ’,通过 变量名 获取数据,甚至数据可以修改 注意: 变量不是数据本身,它们仅仅是一个用于存储数值的容器。可以理解为是一个个用来装东西的纸箱子。 2、变量在内存中的存储 本质

    2024年02月20日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包