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

文章目录

问题描述

图的 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.mzph.cn/web/9698.shtml

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

相关文章

自然资源-地质勘查工作的流程梳理

自然资源-地质勘查工作的流程梳理 地质勘查从广义上可理解为地质工作&#xff0c;地质队员就好像是国家宝藏的“寻宝人”&#xff0c;通过地质勘查&#xff0c;为国家找矿&#xff0c;以保障国家能源资源安全和服务国计民生&#xff0c;发挥着地质工作在国民经济建设中的基础性…

Qt——信号 和 槽

目录 概述 信号和槽的使用 自定义信号和槽 带参数的信号和槽 概述 在Linux系统中&#xff0c;我们也介绍了信号的产生、信号的检测以及信号的处理机制&#xff0c;它就是系统内部的通知机制&#xff0c;也可以是一种进程间通信的方式。在系统中有很多信号&#xff0c;我们可…

kubernate 基本概念

一 K8S 是什么&#xff1f; K8S 全称&#xff1a;Kubernetes 1 kubernate基本概念 作用&#xff1a; 用于自动部署、扩展和管理“容器化&#xff08;containerized&#xff09;应用程序”的开源系统。 可以理解成 K8S 是负责自动化运维管理多个容器化程序&#xff08;比如…

C语言—深入理解指针(3)

1.字符指针变量 一般使用&#xff1a; 另一种使用方法&#xff1a; “hello world”是一个常量字符串&#xff0c;不能被修改。 上述代码是将字符串中的首字符‘h’赋值给指针pstr&#xff0c;用%s打印字符串的时候&#xff0c;只需要提供首字符的地址就行。&#xff08;如果…

Golang | Leetcode Golang题解之第73题矩阵置零

题目&#xff1a; 题解&#xff1a; func setZeroes(matrix [][]int) {n, m : len(matrix), len(matrix[0])col0 : falsefor _, r : range matrix {if r[0] 0 {col0 true}for j : 1; j < m; j {if r[j] 0 {r[0] 0matrix[0][j] 0}}}for i : n - 1; i > 0; i-- {for …

华大hc32l170,新建工程遇到的坑

使用官方给的例程没问题。 然后我在keil新建一个工程&#xff0c;简单的初始化 /********************************************************************************** \brief Main function of project**** \return uint32_t return value, if needed********************…

C语言 | Leetcode C语言题解之第72题编辑距离

题目&#xff1a; 题解&#xff1a; static inline int Min(const int a, const int b, const int c) {int min (a < b) ? a : b;return (min < c) ? min : c; }int minDistance(char * word1, char * word2){int m strlen(word1), n strlen(word2);int dp[m 1][n…

SliderCaptcha滑块验证码功能

SliderCaptcha滑块验证码功能 资源文件及文档&#xff1a;https://gitee.com/LongbowEnterprise/SliderCaptcha <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><…

亚信科技精彩亮相2024中国移动算力网络大会,数智创新共筑“新质生产力”

4月28至29日&#xff0c;江苏省人民政府指导、中国移动通信集团有限公司主办的2024中国移动算力网络大会在苏州举办。大会以“算力网络点亮AI时代”为主题&#xff0c;旨在凝聚生态伙伴合力&#xff0c;共同探索算力网络、云计算等数智能力空间&#xff0c;共促我国算网产业和数…

mysql数据库标识符的使用

ddl CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL,userName varchar(20) DEFAULT NULL,pwd varchar(36) DEFAULT NULL,phone varchar(11) DEFAULT NULL,age tinyint(3) unsigned DEFAULT NULL,sex char(2) DEFAU…

101_Linux文件挂载系统相关

一、文件系统简介 传统的磁盘与文件系统应用中,一个分区就只能够被格式化成为一个文件系统,所以我们可以说一个文件系统就是一个硬盘分区。 随着新技术的出现如LMM与软件磁盘阵列software raid),这些技术可以将一个分区格式化为多个文件系统(例如LWM),也能够将多个分区合成一…

easyExcel导出百万数据

先说一下需求场景,导出接口不能直接查询数据源,是通过接口远程调用,要求支持动态表头,需要支持导出200w以上数据.设计如下: 1.由于数据远程调用,大量数据查询导出不符合实际情况,这里采取远程调用接口,将数据写入华为obs,使用追加写入的方式,可以分批查询写入,避免一次查询全部…

前端数据可视化基础(折线图)

目录 前言&#xff1a; 画布&#xff1a; 折线图 (Line Chart): 前言&#xff1a; 前端中的数据可视化是指将大量数据以图形或图像的形式在前端页面上展示出来&#xff0c;以便用户能够更直观地理解和分析这些数据。数据可视化是一种强大的工具&#xff0c;它利用了人类视觉…

如何查看页面对应的Selenium定位参数

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

SpringBoot配置热部署devtools工具

文章目录 spring-boot-devtools介绍配置热部署devtools工具一、引入依赖二、配置文件三、设置【自动重启更新】效果 spring-boot-devtools介绍 spring-boot-devtools是一组开发工具&#xff0c;其中包括热部署功能。spring-boot-devtools的热部署功能允许开发人员在开发过程中…

阿里云发布通义千问2.5,OpenCompass上得分追平GPT-4 Turbo

5月9日消息&#xff0c;阿里云正式发布通义千问2.5&#xff0c;模型性能全面赶超GPT-4 Turbo&#xff0c;成为地表最强中文大模型。同时&#xff0c;通义千问最新开源的1100亿参数模型在多个基准测评收获最佳成绩&#xff0c;超越Meta的Llama-3-70B&#xff0c;成为开源领域最强…

nmap使用教程

nmap使用教程 一、nmap简介二、nmap常用命令2.1、target specification&#xff08;目标规范&#xff09;2.1.1、用法2.1.2、详情 2.2、HOST DISCOVERY&#xff08;主机发现&#xff09;2.2.1、用法2.2.2、详情 2.3、SCAN TECHNIQUES&#xff08;扫描技术&#xff09;2.4、PORT…

[openwrt-21.02]MT7981+MT7976 WiFi 校准数据打包方法

Openwrt 版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/"…

开源交互审计系统:功能强大、安全好用【送源码】

在当今信息化时代&#xff0c;网络安全越来越受到重视。传统的远程控制工具&#xff0c;如RDP、SSH、VNC等&#xff0c;虽然方便易用&#xff0c;但存在安全隐患&#xff0c;容易被黑客利用。很多时候我们都需要做一些防护的处理来来保障网络安全。 今天了不起来分享一款开源好…

【总结】CE认证详解

文章目录 CE认证 CE作用 适用范围 测试项目 一、2014/30/EU指令&#xff0c;电磁兼容&#xff08;EMC&#xff09;测试项目 二、2014/35/EU指令&#xff0c;低电压&#xff08;LVD&#xff09;测试项目 三、2011/65/EU指令&#xff0c;有害物质&#xff08;RoHS&#xff09…