【图的m着色问题】“回溯法”——《算法设计与分析(第五版)》

2023-11-11


一、算法要求

给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法,使G中每条边的2个顶点着有不同颜色?这个问题是图的m可着色判定问题。
若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。
如果一个图的所有顶点和边都能用某种方式画在平面上且没有任何两边相交,则称这个图是可平面图。著名的平面图的四色猜想是图的m可着色性判定问题的特殊情形。

1. 思路

如果我们把地图上的每一个区域退化成一个点,相邻的区域用连线连接起来,那么地图就变成了一个无向连通图,我们给地图着色就相当于给该无向连通图的每个点着色,要求有连线的点不能有相同颜色。这就是经典的图的m着色问题。给定无向连通图G和m种颜色,找出所有不同的着色方案,使相邻的区域有不同的颜色。
假设地图一共有7个区域,分别是A、B、C、D、E、F、G,我们现在按上面顺序进行编号1~7,每个区域用一个结点表示,相邻的区域有连线。那么地图就转化成了一个无向连通图。
在这里插入图片描述


二、完整代码

1. 主文件

main.cpp:

// Project4: 着色问题
#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;

const int numMax = 50,
		n = 7,
		m = 3,
		edge = 12;
int sum = 0;//记录解的个数
int x[numMax],//解分量
map[numMax][numMax],//图的邻接矩阵
simple[12][2] = { {1,2},{1,3},{1,4},{2,3},{2,5},{3,4},
				{3,5},{4,5},{4,7},{5,6},{5,7},{6,7} };

void CreatMap() {
	int u, v;
	memset(map, 0, sizeof(map));//邻接矩阵里面的数据初始化为0,
	for (int i = 0; i < edge; i++){
		u = simple[i][0];
		v = simple[i][1];
		map[u][v] = map[v][u] = 1;
	}
	int nn = 0;
	for (int i = 0; i < edge; i++) {
		for (int j = 0; j < edge; j++) {
			if (map[i][j] != 0) {
				cout << i << "-" << j << "|";
				nn++;
				if (nn % 6 == 0) {
					cout << endl;
				}
			}
		}
	}
}

bool Coloring(int t) {
	for (int j = 1; j < t; j++) {
		if (map[t][j]) {
			//如果t与j邻接
			if (x[j] == x[t])//着色号是否相同
				return false;
		}
	}
	return true;
}

void Backtrack(int t) {
	if (t > n) { //成功
		sum++;
		cout << "#No." << sum << ": ";
		for (int i = 1; i <= n; i++)//输出该着色方案
			cout << setw(3) << x[i];
		cout << endl;
	}
	else {
		for (int i = 1; i <= m; i++) {//每个结点尝试m种颜色
			x[t] = i;
			if (Coloring(t))
				Backtrack(t + 1);
		}
	}
}

int main() {
	cout << "#Number of nodes: " << setw(3) << n << endl;
	cout << "#Number of colors:" << setw(3) << m << endl;
	cout << "#The following is the adjacency of the undirected graph: " << endl;
	CreatMap();
	cout << "\n#Possible methods include:"<< endl;
	Backtrack(1);
}

2. 效果展示

输入:
在这里插入图片描述
输出:
在这里插入图片描述


三、补充

算法复杂度分析:
(1)时间复杂度
最坏情况下,除了最后一层外,有1+m+m2+…+mn-1=(mn-1)(m-1)~mn-1个结点需要扩展,而这些结点每个都要扩展m个分支,总的分支个数为mn,每个分支都判断约束函数,判断约束条件需要O(n)的时间,因此耗时O(nmn)。在叶子结点处输出可行解需要耗时O(n),在最坏情况下回搜索到每一个叶子结点,叶子个数为mn,故耗时为O(nmn)。因此,时间复杂度为O(nmn)。
(2)空间复杂度
回溯法的另一个重要特性就是在搜索执行的同时产生解空间。在所搜过程中的任何时刻,仅保留从开始结点到当前扩展结点的路径,从开始结点起最长的路径为n。程序中我们使用x[]数组记录该最长路径作为可行解,所以该算法的空间复杂度为O(n)。

文档供本人学习笔记使用,仅供参考。

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

【图的m着色问题】“回溯法”——《算法设计与分析(第五版)》 的相关文章

随机推荐

  • 插入排序 Insertion Sort

    插入排序 Insertion Sort 基本概念 插入排序的实现 时间复杂度和空间复杂度 稳定性 基本概念 从 index 1开始 不断将元素插入右边已经排好序的数组 适用于少量元素 Example 9 2 1 4 3 Step 1 9 2
  • 理解分组卷积与深度可分离卷积

    这两种卷积分别是在ResNext论文与MobileNet系列中体现的 貌似Xception中也有深度可分离卷积的体现 作用都很简单 为了降参 目录 1 分组卷积 group convolution 2 深度可分离卷积 depthwise s
  • 测试用例设计--等价类的几个例子

    等价类的设计思路 根据输入条件 确定等价类 包括有效等价类和无效等价类 建立等价类列表 为每个等价类规定一个唯一的编号 设计一个测试用例 使其尽可能多地覆盖尚未被覆盖的有效等价类 重复这一步 直到所有的有效等价类被覆盖完为止 设计一个测试用
  • 如何查看chrome浏览器插件位置 查看chrome浏览器插件位置的方法

    Chrome浏览器插件种类目繁多 插件支持功能也比较强大 Chrome浏览器内的下载的插件往往也可以被其他浏览器支持 那么如何查看chrome浏览器插件位置 想知道谷歌浏览器插件的存放位置小伙伴快来阅读下文教程 谷歌浏览器最新版下载2020
  • 面试大盘表 - 时间维护功能

    需求描述 由于本人主要负责干部和招聘板块 招聘板块接到了要做一个面试大盘表的需求 需要展示面试官的面试情况 还需要面试官维护自己的可面试时间 之后人资进行面试安排 然后面试者到手机端进行自主选择面试官和面试场次 最终展示 功能描述 移出维护
  • 联想全系列 Lenovo ThinkPad ThinkBook Thinkcenter ThinkStation 原厂恢复系统

    原厂恢复系统镜像 出厂预装正版系统 自带预装Office 自带一键恢复 联网自动激活系统 根据电脑型号或者MTM下载对应的系统恢复镜像 2022 4 30更新 型号后面括号里是MTM号 可对应个人电脑自行对应查找 如没有其对应机型可以Wei
  • C++入门泛型编程介绍

    目录 函数模板 函数模板格式 函数模板的实例化 补充 类模板 类模板的定义格式 类模板的实例化 非类型模板参数 模板特化 函数模板特化 类模板特化 全特化 偏特化 模板分离编译 模板总结 泛型编程 编写与类型无关的通用代码 是代码复用的一种
  • SQLite安装与使用

    在之前的文章中 给出了一个数据库知识的概览 数据库概览 本文介绍一些基础的 常用的SQLite数据库知识 SQLite基础 SQL基础语法 插入 INSERT INTO 表名 列名1 VALUES 列1值 修改 UPDATE 表名 SET
  • background-size属性详解

    css background size 属性详解 background size 指定背景图像大小 以象素或百分比显示 当指定为百分比时 大小会由所在区域的宽度 高度以及 background origin 图片的起始位置 的位置决定 还可
  • 解决lxml导入etree模块报错(或beautifulsoup使用xml解析器时报错)

    Linux下直接pip安装的lxml模块可能是不完整的 import lxml正常 但是from lxml import etree就会报错 ImportError cannot import name etree from lxml 同时
  • 关于Linux开发时,g++明明已经添加-I头文件路径,但是仍报“xxxx.h: No such file or directory“的错误

    之所以将这个bug写在这里 是因为我在ONVIF时遇到的问题 自己编写makefile编译时 明明C 添加了 I却仍然无法找到头文件路径 原因 I别连续在尾部添加 g 不一定能识别 解决是添加多个 I即可 例如 makefile中 INCL
  • 【Qt】问题解决:Unable to create a debugging engine.

    一 问题现象及原因 在 Qt Creator 中以调试模式运行程序时出现以下错误 在 Qt 中打开Tools gt Options gt Kits 发现 Debugger 里面没用可用的调试器 原因 在安装 Visual Studio 20
  • 直接使用POST方法登录网站

    浏览器在 POST 数据之后能够自动登录 那么我能不能在代码中直接模拟这个过程呢 于是我设定了这样的一个流程 1 设置浏览器的 headers 设置请求等 2 使用 httpfox 工具获取post data 3 将post data 写下
  • 线性代数_3、行列式的七大性质及推论

    性质 1 D T D T DT D 转置 定义 就是把行列进行调换 行变成列 列变成行 表述方式 D T
  • Vue-elementui 下拉框(el-dropdown)绑定点击事件

    ElementUI组件下拉框绑定点击事件无效的解决方案 在使用脚手架构建的项目中需要使用到下拉组建
  • nacos学习思路

    添加一个链接 使用和原理 nacos使用教程及原理简介 nacos多机房部署 一梦无痕bzy的博客 CSDN博客 1 核心概念 Namespace group service cluster instance 2 注册表结构 其实是一个双层
  • ELK日志监控平台(三)---kibana数据可视化

    目录 一 基本简介 编辑 二 安装 三 创建可视化访问量的指标 四 创建可视化访问量的垂直条形图 五 启动xpack安全验证 官放文档 Explore Kibana using sample data Kibana Guide 7 6 El
  • hbuilderx制作简单网页_简单粗暴,直接教你上手制作网页—前端开发入门

    首先我要说学习前端网页制作其实很简单 今天我带着你踏入前端开发的大门 我不会给大家说一些难懂的概念上的东西 有些知识其实不必知道 学习之后再慢慢了解也是可以的 简单粗暴 直接让你上手就完事了 先大致了解一下HTML的构成 简单的说HTML网
  • 小米集团王嵋因错误表达致歉并请辞;亚马逊云服务出现中断,许多网站受到影响;deepin 深度系统更新发布

    整理 郑丽媛 头图 CSDN 下载自东方 IC CSDN高校俱乐部的读者朋友们下午好哇 快来看今天都有哪些值得我们技术人关注的重要新闻吧 一分钟速览新闻点 微信 今年已对超过620 万个恶意注册违规帐号进行处理 对标 Mac mini 联想
  • 【图的m着色问题】“回溯法”——《算法设计与分析(第五版)》

    文章目录 一 算法要求 1 思路 二 完整代码 1 主文件 2 效果展示 三 补充 一 算法要求 给定无向连通图G和m种不同的颜色 用这些颜色为图G的各顶点着色 每个顶点着一种颜色 是否有一种着色法 使G中每条边的2个顶点着有不同颜色 这个