无向图染色

2023-11-14

题目描述

给一个无向图染色,可以填红黑两种颜色,必须保证相邻两个节点不能同时为红色,输出有多少种不同的染色方案?


输入描述


第—行输入M(图中节点数)N(边数)
后续N行格式为:V1V2表示一个V1到V2的边。
数据范围: 1<=M<= 15,0 <=N<=M *3,不能保证所有节点都是连通的。


输出描述


输出一个数字表示染色方案的个数。


用例

输入

4 4
2 4
3 4
1 3
1 2

输出

7

说明

4个节点,4条边,1号节点和2号节点相连,2号节点和4号节点相连,3号节点和4号节点相连,
1号节点和3号节点相连,若想必须保证相邻两个节点不能同时为红色,总共7种方案。

思路

对每个节点可能的染色进行搜索。对每个未染色的节点分两种情况:当染黑色的情况下,不对其他节点产生影响;当染红色的情况下,要查找这个节点连接的所有边,找到相邻节点并直接规定为黑色。每当所有节点被染色完成就说明找到了一种结果,遍历所有可能后结束。

代码实现

import java.util.ArrayList;
import java.util.Scanner;

class Main {

    public static class Side {
        int from;
        int to;

        public Side(int from, int to) {
            this.from = from;
            this.to = to;
        }
    }

    public static int[] pointsColor;
    public static ArrayList<Side> sideArrayList = new ArrayList<>();
    public static int result;

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] heads = in.nextLine().split(" ");
        int pointsNum = Integer.parseInt(heads[0]);
        int sidesNum = Integer.parseInt(heads[1]);

        for (int i = 0; i < sidesNum; i++) {
            String[] strings = in.nextLine().split(" ");
            Side side = new Side(Integer.parseInt(strings[0]) - 1, Integer.parseInt(strings[1]) - 1);
            sideArrayList.add(side);
        }
        pointsColor = new int[pointsNum];
        colored(0);
        System.out.println(result);

    }

    //0无 1黑 2红
    public static void colored(int current) {
        if (current < pointsColor.length) {
            //未染色
            if (pointsColor[current] == 0) {
                //黑
                pointsColor[current] = 1;
                colored(current + 1);
                //红
                pointsColor[current] = 2;
                for (Side side : sideArrayList) {
                    //临边黑
                    if (side.from == current) {
                        pointsColor[side.to] = 1;
                    }
                    if (side.to == current) {
                        pointsColor[side.from] = 1;
                    }
                }
                colored(current + 1);
            } else {
                //如果已经染过则直接查找下一个点
                colored(current + 1);
            }
            //搜索完之后回退
            pointsColor[current] = 0;
        } else if (current == pointsColor.length) {
            result += 1;
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无向图染色 的相关文章

随机推荐

  • 聚类算法OPTICS的理解及实现

    前言 前面给大家介绍到了聚类算法中比较经典的 DBSCAN 算法 对于数据量小而且相对比较密集 密度相似的数据集来说 是比较合适的 那么接下来给大家介绍它的改进版 OPTICS Ordering points to identify the
  • 反调试-动态代码分析

    反调试 动态代码分析 1 动态解析代码 许多编程语言都允许动态解析源代码指令 这使得程序可以执行基于用户输入的动态指令 若不经过适当的验证 程序会错误地认为由用户直接提供的指令仅会执行一些无害的操作 会正常解析并执行该指令 远程用户可以提供
  • 张校捷《深度强化学习算法与实践:基于PyTorch的实践》

    在过去的几年里 人工智能 AI 领域取得了令人瞩目的进展 从无人驾驶汽车到 ChatGPT 再诸如围棋 Algha Go 和象棋等棋类游戏中击败世界级选手 这些突破背后的关键技术便是深度强化学习 Deep Reinforcement Lea
  • aspx调试的时候其他机器也可以打开_ABB、KUKA、FANUC、安川四大家族机器人安全回路小结...

    很多新人在机器人安装调试的时候不知道如何下手 在此个人分享一下机器人安装调试的流程如下 一个机器人项目的安装调试是否能顺利的通过客户验收 机器人的安全回路非常重要 在此分享下ABB KUKA FANUC 安川 四大家族机器人安全回路小结如下
  • 漏极开路门详解(Open Drain, OD)定义 提示 上拉电阻对OD门动态性能的影响

    定义 指CMOS门电路的输出只有NMOS管 并且它的漏极是开路的 提示 由于OD门不能输出高电平 只能输出低电平 所以在使用OD门时必须在漏极和电源VDD间接一个上拉电阻 上拉电阻对OD门动态性能的影响 当其他门电路作为OD门的负载时 OD
  • 动态规划算法(2)最长回文子串详解

    文章目录 最长回文字串 动态规划 代码示例 前篇 1 初识动态规划 最长回文字串 传送门 https leetcode cn problems longest palindromic substring description 给你一个字符
  • PopupMenuView

    PopupMenuView 项目地址 kareluo PopupMenuView 简介 A view just like UIMenuController of iOS 一个类似 iOS 中弹框气泡菜单的控件 更多 作者 提 Bug 标签
  • 开心档-软件开发入门之Bootstrap4 按钮

    Bootstrap4 按钮 Bootstrap 4 提供了不同样式的按钮 实例
  • 还是畅通工程(水题) kruskal算法

    http acm hdu edu cn showproblem php pid 1233 Problem Description 某省调查乡村交通状况 得到的统计表中列出了任意两村庄间的距离 省政府 畅通工程 的目标是使全省任何两个村庄间都
  • Techniques for working with Big Data

    In the Big data it can be text data digital image data digital video data digital audio data and more Consequently with
  • 202.为用户定义的数据类型绑定规则案例

    示例说明 下面的示例演示了如何把规则绑定到列和用户定义的数据类型 并且演示了修改绑定于列和用户定义的数据类型的规则时 这两者之间的差异 定义数据类型 EXEC sp addtype ut age int null GO 为ut age定义规
  • 四层协议和七层协议详解

    一 TCP IP网络分层模型 四层协议 TCP IP的设计者创造性的提出 分层 的概念 把复杂的网络通信划分出多个层次 再给每一层分配不同的职责 采用 分而治之 的方法解决了网络通信的难题 TCP IP是一个纯软件的栈 缺少物理设备 TCP
  • 通过IP地址进行精准定位技术、方法与隐私问题的探讨

    导语 随着互联网和移动设备的普及 通过IP地址进行精准定位已成为现实 这一技术的发展带来了许多便利 但也引发了隐私问题的关注 本文将探讨通过IP地址进行精准定位的技术 方法以及涉及的隐私问题 技术和方法 IP地址的基本原理 IP地址是一个数
  • Elasticsearch使用系列-ES增删查改基本操作+ik分词

    一 安装可视化工具Kibana ES是一个NoSql数据库应用 和其他数据库一样 我们为了方便操作查看它 需要安装一个可视化工具 Kibana 官网 https www elastic co cn downloads kibana 和前面安
  • vue自定义指令---长按执行

    首先创建longpress js文件 import Vue from vue Vue directive longpress bind function el binding vNode if typeof binding value fu
  • Java中Transactional注解业务方法里面try catch会导致事务注解失效吗

    在 Java 中 使用 try catch 语句来捕获异常是很常见的 但是 在使用了 Transactional 注解的业务方法内部使用 try catch 语句并不会导致事务注解失效 当在带有 Transactional 注解的方法中使用
  • 【MifareClassicTool】小米NFC手机模拟加密门禁详细教程(Android手机通用)

    mifare官方最新版地址https www icaria de mct releases 3 0 资源名称 MifareClassicTool 资源分类 Android NFC类软件 资源大小 960 5 Kb 资源版本 V2 2 3 准
  • python中chr()函数和ord()函数的用法

    Python内置函数 一 chr 函数 格式 Chr lt 数值表达式 gt 说明 函数返回值类型为String 其数值表达式值取值范围为0 255 以下是 chr 方法的语法 chr i i 可以是10进制也可以是16进制的形式的数字 返
  • 【Matting】MODNet:实时人像抠图模型-笔记

    paper MODNet Real Time Trimap Free Portrait Matting via Objective Decomposition AAAI 2022 github https github com ZHKKKe
  • 无向图染色

    题目描述 给一个无向图染色 可以填红黑两种颜色 必须保证相邻两个节点不能同时为红色 输出有多少种不同的染色方案 输入描述 第 行输入M 图中节点数 N 边数 后续N行格式为 V1V2表示一个V1到V2的边 数据范围 1 lt M lt 15