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

文章目录

因上努力

个人主页:丷从心

系列专栏:回溯法

果上随缘


问题描述

图的 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] * ncount = 0def is_valid(colors, vertex, color):# 约束函数: 检查给定顶点的着色是否满足约束条件(与相邻顶点的颜色不重复)for i in range(n):if graph[vertex][i] and colors[i] == color:return Falsereturn Truedef backtrack(colors, vertex):nonlocal countif vertex == n:count += 1print(colors)returnfor color in range(m):if is_valid(colors, vertex, color):colors[vertex] = colorbacktrack(colors, vertex + 1)colors[vertex] = -1backtrack(colors, 0)return countgraph = [[0, 1, 1, 1],[1, 0, 1, 0],[1, 1, 0, 1],[1, 0, 1, 0]
]m = 3print('满足条件的着色方案如下:')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.rhkb.cn/news/225946.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter配置Android和IOS允许http访问

默认情况下&#xff0c;Android和IOS只支持对https的访问&#xff0c;如果需要访问不安全的连接&#xff0c;也就是http&#xff0c;需要做以下配置。 Android 在res目录下的xml目录中(如果不存在&#xff0c;先创建xml目录)&#xff0c;创建一个xml文件network_security_con…

Python初学者必须吃透的69个内置函数!

所谓内置函数&#xff0c;就是Python提供的, 可以直接拿来直接用的函数&#xff0c;比如大家熟悉的print&#xff0c;range、input等&#xff0c;也有不是很熟&#xff0c;但是很重要的&#xff0c;如enumerate、zip、join等&#xff0c;Python内置的这些函数非常精巧且强大的&…

SpreadJS 集成使用案例

SpreadJS 集成案例 介绍&#xff1a; SpreadJS 基于 HTML5 标准&#xff0c;支持跨平台开发和集成&#xff0c;支持所有主流浏览器&#xff0c;无需预装任何插件或第三方组件&#xff0c;以原生的方式嵌入各类应用&#xff0c;可以与各类后端技术框架相结合。SpreadJS 以 纯前…

python实现一维傅里叶变换——冈萨雷斯数字图像处理

原理 傅立叶变换&#xff0c;表示能将满足一定条件的某个函数表示成三角函数&#xff08;正弦和/或余弦函数&#xff09;或者它们的积分的线性组合。在不同的研究领域&#xff0c;傅立叶变换具有多种不同的变体形式&#xff0c;如连续傅立叶变换和离散傅立叶变换。最初傅立叶分…

ArcGIS Pro中Conda环境的Scripts文件解读

Scripts中包含的文件如下 1. propy.bat 用于在 ArcGIS Pro 外部运行 Python 脚本&#xff08;扩展名为 .py 的文件&#xff09;。使用的conda环境是与ArcGIS pro环境同步。propy.bat原理是代替各自python环境下的python.exe&#xff0c;主要区别是propy.bat使用的是与Pro同的…

携手共进 探索生命|清华大学创融同学会走进生命系 共话细胞科技新未来

携手共进 探索生命&#xff5c;清华大学创融同学会走进生命系 共话细胞科技新未来 探索细胞产业新高度&#xff0c;赋予生命健康更多保障&#xff01;日前&#xff0c;清华大学创融同学会一行莅临全生命周期健康管理中心——生命系参观交流。生命系领导以及全体员工对来访贵宾…

Javascript break continue 跳转语句讲解

Javascript break continue 跳转语句讲解 目录 Javascript break continue 跳转语句讲解 一、break语句 二、continue语句 JavaScript支持的跳转语句主要有2种&#xff1a; &#xff08;1&#xff09;break语句&#xff1b;&#xff08;2&#xff09;continue语句&#xf…

Jmeter 性能 —— 监控服务器!

Jmeter 监控Linux需要三个文件 JMeterPlugins-Extras.jar (包&#xff1a;JMeterPlugins-Extras-1.4.0.zip)JMeterPlugins-Standard.jar (包&#xff1a;JMeterPlugins-Standard-1.4.0.zip)ServerAgent-2.2.3.zip 1、Jemter 安装插件 在插件管理中心的搜索Servers Performa…

软件测试/测试开发丨Python学习笔记之内置库科学计算、日期与时间处理

Python 内置库 - 科学计算 了解 math 函数 math 函数&#xff0c;python 提供的内置数学类函数库&#xff0c;包含了很多数学公式。 比如幂函数运算&#xff0c;三角函数&#xff0c;高等函数运算等。 math 函数操作 数字常数数论与表示函数幂对数函数三角对数函数高等特殊…

Flask 日志

flask 日志 代码源码源自编程浪子flask点餐小程序代码 记录用户访问日志 和 错误日志 这段代码是一个基于Flask框架的日志服务类&#xff0c;用于 记录用户访问日志 和 错误日志。代码中定义了一个名为LogService的类&#xff0c;其中包含了两个静态方法&#xff1a;addAcc…

C语言-第十七周课堂总结-数组

找出矩阵中最大值所在的位置 程序解析-求矩阵的最大值 源程序段 二维数组 多维数组的空间想象 一维数组&#xff1a;一列长表或一个向量二维数组&#xff1a;一个表格或一个平面矩阵三维数组&#xff1a;三位空间的一个方阵多维数组&#xff1a;多维空间的一个数据矩阵 …

docker学习笔记02-安装mysql

1.安装mysql8 下载MySQL镜像 docker pull mysql:8.0创建并启动容器 docker run -itd --name mysqltest -p 9999:3306 -e MYSQL_ROOT_PASSWORD123456 mysql其中-it是交互界面 -d是后台执行 -name 指定容器名称 -p指定映射端口 -e设置环境变量 最后mysql是镜像名或者用镜像id如…

基于JAVA的木马文件检测系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 木马分类模块2.3 木马软件模块2.4 安全资讯模块2.5 脆弱点模块2.6 软件检测模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 木马分类表3.2.2 木马软件表3.2.3 资讯表3.2.4 脆弱点表3.2.5 软件检测表…

IPv4归属地信息查询方法与应用

IPv4地址归属地信息查询是网络管理和安全领域的关键工具。本文将介绍IPv4地址的概念&#xff0c;探讨IPv4归属地信息的重要性&#xff0c;并详细介绍几种查询IPv4归属地信息的方法以及其应用场景。 第一部分&#xff1a;IPv4地址简介 1.1 什么是IPv4地址 IPv4&#xff08;In…

vtk渲染管线Chap02.4

书章节2.4管线 VTK两个重要概念&#xff0c;一个是数据的可视化表达&#xff0c;一个是可视化管线。 2.4_vtkPipelineDemo.cpp如下 //VTK INIT With Opengl2 #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2) VTK_MODULE_INIT(vtkInteractionStyle)#in…

前端文件在虚拟机,后端在本机,两个如何通信

前端文件在虚拟机&#xff0c;后端在本机&#xff0c;两个如何通信 如果前端的文件放在虚拟机里面&#xff0c;但是调用接口的后端在本地调试&#xff0c;如何做到在虚拟机中也能访问到本地的接口内容。 其实这个问题很简单&#xff0c;只要讲本地的IP和虚拟机中的IP结合就可…

【Web开发】深度剖析RBAC:概念、实现方法、优势及在Web应用中的应用

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; Web开发 ⛳️ 功不唐捐&#xff0c;玉汝于成 前言 在现代Web开发的激烈竞争中&#xff0c;实现可扩展性、安全性和用户体验的平衡成为了至关重要的挑战。在这一背景下&#xff0c;Role-Bas…

模型量化 | Pytorch的模型量化基础

官方网站&#xff1a;Quantization — PyTorch 2.1 documentation Practical Quantization in PyTorch | PyTorch 量化简介 量化是指执行计算和存储的技术 位宽低于浮点精度的张量。量化模型 在张量上执行部分或全部操作&#xff0c;精度降低&#xff0c;而不是 全精度&#xf…

在Vue2中快速使用ECharts

在Vue2中快速使用ECharts ECharts这里简单介绍一下ECharts的图表其他图表 背景: 因为博主在做项目时&#xff0c;有一个需求要求是可视化渲染出文章的分类信息以及文章内容&#xff0c;当时第一时间就想到了ECharts&#xff0c;因此就引入了在Vue2中快速使用ECharts。 ECharts …

行人重识别数据集-统一为market1501数据集进行多数据集联合训练

一、前言 常用的数据集&#xff1a; 数据集下载链接&#xff1a;https://kaiyangzhou.github.io/deep-person-reid/datasets.html https://kaiyangzhou.github.io/deep-person-reid/datasets.html#sensereid-sensereid 二、数据集合并 第一步&#xff1a;market1501的数据集…