【回溯】图的m着色问题Python实现

news2025/7/8 3:50:55

文章目录

因上努力

个人主页:丷从心

系列专栏:回溯法

果上随缘


问题描述

图的 m m m可着色判定问题
  • 给定无向连通图 G G G m m m种不同的颜色,用这些颜色为图 G G G的各顶点着色,每个顶点着一种颜色,是否有一种着色法,使 G G G中每条边的 2 2 2个顶点着有不同颜色
图的 m m m可着色优化问题
  • 若一个图最少需要 m m m种颜色才能使图中每条边连接的 2 2 2个顶点着不同颜色,则称这个数 m m m为该图的色数
  • 求一个图的色数 m m m的问题称为图的 m m m可着色优化问题
四色猜想
  • 如果一个图的所有顶点和边都能用某种方式画在平面上且没有任何两边相交,则称这个图是可平面图
  • 四色猜想:在一个平面或球面上的任何地图能够只用 4 4 4种颜色来着色,使相邻的国家在地图上着不同颜色
  • 假设每个国家在地图上是单连通域,还假设两个国家相邻是指这两个国家有一段长度不为 0 0 0的公共边界,而不仅有一个公共点,这样的地图容易用平面图表示,地图上的每个区域相应平面图中一个顶点,两个区域在地图上相邻,它们在平面图中相应的 2 2 2个顶点之间有一条边相连

回溯法

  • 用图的邻接矩阵 a a a表示无向连通图 G = ( V , E ) G = (V , E) G=(V,E),若 ( i , j ) (i , j) (i,j)属于图 G = ( V , E ) G = (V , E) G=(V,E)的边集 E E E,则 a [ i ] [ j ] = 1 a[i][j] = 1 a[i][j]=1,否则 a [ i ] [ j ] = 0 a[i][j] = 0 a[i][j]=0,整数 1 1 1 2 2 2 ⋯ \cdots m m m用来表示 m m m种不同颜色,顶点 i i i所着的颜色用 x [ i ] x[i] x[i]表示,数组 x [ 1 : n ] x[1 : n] x[1:n]是问题的解向量
  • 问题的解空间可表示为一棵高度为 n n n的完全 m m m叉树,解空间树的第 i ( 0 ≤ i ≤ n − 1 ) i (0 \leq i \leq n - 1) i(0in1)层中每个结点都有 m m m个儿子,每个儿子相应于 x [ i ] x[i] x[i] m m m个可能的着色之一,第 n n n层结点均为叶结点
  • i = n i = n i=n时,算法搜索至叶结点,得到新的 m m m着色方案,当前找到的可 m m m着色方案数 s u m sum sum 1 1 1
  • i < n i < n i<n时,当前扩展结点 Z Z Z是解空间中的内部结点,该结点有 m m m个儿子结点 x [ i ] x[i] x[i],对当前扩展结点 Z Z Z的每个儿子结点,由约束函数检查其可行性,并以深度优先的方式递归地对可行子树搜索,或剪去不可行子树

时间复杂性

  • m m m可着色问题的解空间树中内结点个数是 ∑ i = 0 n − 1 m i \displaystyle\sum\limits_{i = 0}^{n - 1}{m^{i}} i=0n1mi,对于每个内结点,在最坏情况下,用约束函数检查当前扩展结点的每个儿子所对应的颜色的可用性需耗时 O ( m n ) O(mn) O(mn)
  • 因此,回溯法总的时间耗费是 ( m n ) ∑ i = 0 n − 1 m i = n × m ( m n − 1 ) / ( m − 1 ) = O ( n m n ) (mn) \displaystyle\sum\limits_{i = 0}^{n - 1}{m^{i}} = n \times m (m^{n} - 1) / (m - 1) = O(n m^{n}) (mn)i=0n1mi=n×m(mn1)/(m1)=O(nmn)

Python实现

def count_graph_coloring(graph, m):
    n = len(graph)
    colors = [-1] * n
    count = 0

    def is_valid(colors, vertex, color):
        # 约束函数: 检查给定顶点的着色是否满足约束条件(与相邻顶点的颜色不重复)
        for i in range(n):
            if graph[vertex][i] and colors[i] == color:
                return False

        return True

    def backtrack(colors, vertex):
        nonlocal count

        if vertex == n:
            count += 1
            print(colors)

            return

        for color in range(m):
            if is_valid(colors, vertex, color):
                colors[vertex] = color

                backtrack(colors, vertex + 1)

                colors[vertex] = -1

    backtrack(colors, 0)

    return count


graph = [
    [0, 1, 1, 1],
    [1, 0, 1, 0],
    [1, 1, 0, 1],
    [1, 0, 1, 0]
]

m = 3

print('满足条件的着色方案如下:')

coloring_count = count_graph_coloring(graph, m)

print(f'着色方案数: {coloring_count}')
满足条件的着色方案如下:
[0, 1, 2, 1]
[0, 2, 1, 2]
[1, 0, 2, 0]
[1, 2, 0, 2]
[2, 0, 1, 0]
[2, 1, 0, 1]
着色方案数: 6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1347540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot实用篇

SpringBoot实用篇 1、热部署 什么是热部署&#xff1f; 所谓热部署&#xff0c;就是在应用正在运行的时候升级软件&#xff0c;却不需要重新启动应用。对于Java应用程序来说&#xff0c;热部署就是在运行时更新Java类文件。 热部署有什么用&#xff1f; 节约时间&#xff0c;热…

【python高级用法】迭代器、生成器、装饰器、闭包

迭代器 可迭代对象&#xff1a;可以使用for循环来遍历的&#xff0c;可以使用isinstance()来测试。 迭代器&#xff1a;同时实现了__iter__()方法和__next__()方法&#xff0c;可以使用isinstance()方法来测试是否是迭代器对象 from collections.abc import Iterable, Iterat…

Select缺点及代码示例

一、Select缺点 二、服务器端 #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/select.h>int main() {// 创建socketint lfd socket(PF_INET, SOCK_STREAM, 0)…

java进阶(三)

IO与网络编程 3 输入输出流IO3.1 基础定义3.2 IO框架3.3 读取字节输入流-InputStream3.3.1 InputStream.read3.3.2 FileInputStream类说明 3.4读取字符输入流Reader3.4.1 Reader.read3.4.2 FileReader类说明 3.5 字节输出流OutputStream3.5.1 OutputStream.write3.5.2 FileOutp…

Docker容器基础知识点总结

一 、Docker架构 dockers加速镜像&#xff1a; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://z90yxq2m.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restar…

thinkphp6.0升级到8.0

目录 一&#xff1a;升级过程 二&#xff1a;报错处理 最近写的项目需要使用thinkphp8.0&#xff0c;之前的老项目需要从php6.0升级到8.0&#xff0c;特此记录下升级过程。 一&#xff1a;升级过程 查看版本&#xff1a; php think version,我目前的版本是6.1.4 生成thin…

Rust学习笔记001:HELLOW WORLD + Cargo

Rust介绍 Rust&#xff08;中文称为“锈”&#xff09;是一种由Mozilla开发的系统编程语言&#xff0c;它着力于提供安全性、并发性和实用性。Rust的设计目标是消除程序出现的内存安全性问题&#xff0c;如空指针引用、数据竞争等。它通过在编译时进行严格的所有权和借用检查来…

Java实现树结构(为前端实现级联菜单或者是下拉菜单接口)

Java实现树结构&#xff08;为前端实现级联菜单或者是下拉菜单接口&#xff09; 我们常常会遇到这样一个问题&#xff0c;就是前端要实现的样式是一个级联菜单或者是下拉树&#xff0c;如图 这样的数据接口是怎么实现的呢&#xff0c;是什么样子的呢&#xff1f; 我们可以看看 …

【jdk与tomcat配置文件夹共享防火墙设置(入站出站规则)】

目录 一、jdk与tomcat配置 1.1 jdk配置 1.2 tomcat配置 二、文件夹共享 2.1 为什么需要配置文件夹共享功能 2.2 操作步骤 2.2.1 高级共享 2.2.2 普通共享 2.3 区别 三、防火墙设置&#xff08;入站规则&出站规则&#xff09; 3.1 入站规则跟出站规则 3.2 案例…

【低代码平台】10个开源免费Airtable 的替代方案

Airtable是一个易于使用的简单低代码平台&#xff0c;有助于团队协作管理复杂的数据表&#xff0c;并创建定制的工作流程。把它想象成一个类固醇上的云电子表格。 Airtable还简化了数据输入过程&#xff0c;连接和集成第三方服务和应用程序&#xff0c;并提供了许多数据导入/导…

第二部分 离散型随机变量

目录 求分布律里的未知数 例1 例2 根据X的分布律写Y的分布律 例3 根据(X,Y)的分布律写Z的分布律 例4 根据(X,Y)的分布律写边缘分布律 例5 X与Y相互独立时的联合分布律 例6 根据分布律求期望、方差 例7 求分布律里的未知数 例1 已知X的分布律为 X-202P0.40.3k ,试求k 解 0.40…

普中STM32-PZ6806L 使用FlyMcu串口烧录程序

简介 我的串口下载电路坏掉了, 所以研究了下如何通过USB转TTL进行程序的下载, 为后续Bootloader部分做准备;连接 我的板几乎是十年前买的&#xff0c; 所以电路与现有网上的资料有些差异, 所以仅供参考 USB 转 TTL线 与开发板 连接&#xff0c; 如图图中 ①, 需要去掉第一个…

[2024区块链开发入门指引] - 比特币运行原理

一份为小白用户准备的免费区块链基础教程 工欲善其事,必先利其器 Web3开发中&#xff0c;各种工具、教程、社区、语言框架.。。。 种类繁多&#xff0c;是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役&#xff1f; 参见另一篇博文&#x1f449; 2024最全面…

RFC6749-OAuth2.0

前言 最近在项目中需要实现SSO(单点登录)功能,以实现一处注册,即可在任何平台之间登录的功能。我们项目中并没有直接对接第三方认证系统而是通过集成keycloak 完成一系类安全协议的对接工作。如果我们在代码级别自己完成各种安全协议的对接是一项十分大的工程。不仅要走统一的…

提取 PE 文件的各种信息

前段时间项目需要实现对 Windows PE 文件版本信息的提取&#xff0c;如文件说明、文件版本、产品名称、版权、原始文件名等信息。获取这些信息在 Windows 下当然有一系列的 API 函数供调用&#xff0c;简单方便。 我们先看一下PE文件结构&#xff0c;PE文件由DOS首部&#xff0…

【网络面试(4)】协议栈和套接字及连接阶段的三次握手原理

1. 协议栈 一直对操作系统系统的内核协议栈理解的比较模糊&#xff0c;借着这一篇博客做一下简单梳理&#xff0c; 我觉得最直白的理解就是&#xff0c;内核协议栈就是操作系统中的一个网络控制软件&#xff0c;就是一段程序代码&#xff0c;它负责和网卡驱动程序交互&#xff…

【nodejs】前后端身份认证

前后端身份认证 一、web开发模式 服务器渲染&#xff0c;前后端分离。 不同开发模式下的身份认证&#xff1a; 服务端渲染推荐使用Session认证机制前后端分离推荐使用JWT认证机制 二、session认证机制 1.HTTP协议的无状态性 了解HTTP协议的无状态性是进一步学习Session认…

appium入门基础

介绍 appium支持在不同平台的UI自动化&#xff0c;如web,移动端,桌面端等。还支持使用java&#xff0c;python&#xff0c;js等语言编写自动化代码。主要用于自动化测试脚本&#xff0c;省去重复的手动操作。 Appium官网 安装 首先必须环境有Node.js用于安装Appium。 总体来…

接入Cloudflare后Nginx和Django获取用户真实IP的办法

可以用Nginx的real_ip的相关命令来实现这个需求。 01-real_ip命令集详解 real_ip命令的使用分为两个步骤: 01-1-设置从哪些代理IP获取真实IP 第1个步骤&#xff1a;通过set_real_ip_from命令设置从哪些代理IP请求获取真实的IP,比如下面的命令&#xff1a; set_real_ip_from…

2022年全球软件质量效能大会(QECon北京站2022)-核心PPT资料下载

一、峰会简介 当前&#xff0c;新一轮科技革命和产业变革正在重塑全球经济格局&#xff0c;以云计算为代表的新一代信息技术创新活跃&#xff0c;与实体经济深度融合&#xff0c;推动泛在连接、数据驱动、智能引领的数字经济新形式孕育而生。 新兴技术的出现给测试乃至整个软…