计算机算法分析与设计(21)---回溯法(图着色问题)

news2024/9/23 15:31:25

文章目录

  • 一、背景知识
  • 二、问题转换与描述
  • 三、算法讲解
    • 3.1 思路分析
    • 3.2 状态空间生成树
    • 3.3 代码编写


一、背景知识

 1. 为地图或其他由不同区域组成的图形着色时,相邻国家/地区不能使用相同的颜色。 我们可能还想使用尽可能少的不同颜色进行填涂。一些简单的“地图”(例如棋盘)仅需要两种颜色(黑白),但是大多数复杂的地图需要更多的颜色。

 2. (1)每张地图包含四个相互连接的国家时,它们至少需要四种颜色。1852年,植物学专业的学生弗朗西斯·古思里(Francis Guthrie)于1852年首次提出“四色问题”。他观察到四种颜色似乎足以满足他尝试的任何地图填色问题,但他无法找到适用于所有地图的证明。这个问题被称为四色问题。
 (2)长期以来,数学家无法证明四种颜色就够了,或者无法找到需要四种以上颜色的地图。直到1976年德国数学家沃尔夫冈·哈肯(Wolfgang Haken,生于1928年)和肯尼斯·阿佩尔(Kenneth Appel,1932年-2013年)使用计算机证明了四色定理,他们将无数种可能的地图缩减为1936种特殊情况,每种情况都由一台计算机进行了总计超过1000个小时的检查。

 3. 四色定理是第一个使用计算机证明的著名数学定理,此后变得越来越普遍,争议也越来越小 更快的计算机和更高效的算法意味着今天您可以在几个小时内在笔记本电脑上证明四种颜色定理。

二、问题转换与描述

 1. 一个地图用一个平面图 G G G 表示。将地图的每个区域用图 G G G 的一个结点表示,若两个区域相邻,则相应的两个结点用一条边连接起来。

在这里插入图片描述
 2. 点 m m m–着色问题:给定一个无向图 G = ( V , E ) G=(V,E) G=(V,E),需要对图 G G G 中的每个顶点用 m m m 种颜色中的一种着色,记为 1 , 2 , . . . . . . m 1,2,......m 1,2,......m,使得相邻的顶点不同色。

在这里插入图片描述

三、算法讲解

3.1 思路分析

 1. 采用 n n n 元组 ( x 0 , x 1 , . . . x n − 1 ) (x_0,x_1,...x_{n-1}) (x0,x1,...xn1) 表示图 G G G m m m–着色问题的解,并采用邻接矩阵表示无向图 G = ( V , E ) G=(V,E) G=(V,E)

  • a [ i ] [ j ] = 1 , ( i , j ) ∈ E a[i][j]=1,(i,j)∈E a[i][j]=1(i,j)E
  • a [ i ] [ j ] = 0 ,其他 a[i][j]=0,其他 a[i][j]=0,其他

 2. 显示约束: n n n 元组 ( x 0 , x 1 , . . . x n − 1 ) , x i ∈ [ 1 , 2... , m ] , 1 ≤ i ≤ n (x_0,x_1,...x_{n-1}),x_i ∈ [1,2...,m],1≤i≤n (x0,x1,...xn1),xi[1,2...,m],1in 表示节点的 i i i 的颜色。 x i = 0 x_i=0 xi=0 表示没有可用的颜色。因此解空间的大小为 m n m^n mn
 隐式约束:如果边 ( i , j ) ∈ E (i,j)∈E (i,j)E,则 x i ≠ x j x_i≠x_j xi=xj,即此时 a [ i ] [ j ] = 1 a[i][j]=1 a[i][j]=1

3.2 状态空间生成树

在这里插入图片描述

3.3 代码编写

时间复杂性 O ( n m n ) O(nm^n) O(nmn)
使用深度优先搜索(DFS)从解空间树的根节点开始搜索,并在每个分支结点处调用 o k ( ) ok() ok() 函数来剪枝。如果在整棵解空间树中找到了一组可行解,那么算法就停止搜索并输出结果。如果找不到任何一个可行解,则算法输出无解信息。
具体实现过程:
首先,需要定义一个二维数组 G [ ] [ ] G[ ][ ] G[][],用于存储图中的边。其中, G [ u ] [ v ] = = 1 G[u][v] == 1 G[u][v]==1 表示节点 u u u 和节点 v v v 之间有边相连,反之为 0 0 0。同时,还需要定义一个一维数组 c o l o r [ ] color[ ] color[],用于存储每个节点的颜色。
最初将所有边权赋值为 0 0 0,即不存在边。然后,读入所有边,将对应的边权赋值为 1 1 1。读入颜色数 m m m,并从节点 1 1 1 开始做深度优先搜索,依次尝试给每个节点涂上不同的颜色。在每个分支结点处,使用 o k ( ) ok() ok() 函数来判断是否符合要求。如果染色成功,则继续对下一个节点做深度优先搜索。如果找到了一组可行解,则输出结果。

#include <iostream>
#include <cstring>
using namespace std;

const int maxn = 1005;
int G[maxn][maxn], color[maxn];//用于存储图中的边--用于存储每个节点的颜色 
int n, m;                      //n表示图中节点的数量,m表示可供选择的颜色数目。
 
bool ok(int u, int c){
    for (int i = 1; i <= n; i++)
	{
        if (G[u][i] == 1 && color[i] == c)
            return false;
    }
    return true;
}
 
bool dfs(int u){
    if (u > n)
        return true;
    for (int i = 1; i <= m; i++)
	{
        if (ok(u, i))
		{
            color[u] = i;
            if (dfs(u + 1))
                return true;
            color[u] = 0;
        }
    }
    return false;
}
 
int main(){
    memset(G, 0, sizeof(G));        //初始化邻接矩阵为0
    memset(color, 0, sizeof(color));//初始化颜色为0
    int e;                          //e表示图中边的数量
    cout << "请输入顶点数和可用颜色数:" << endl;
    cin >> n >> m;
    cout << "请输入边数:" << endl;
    cin >> e;
	cout << "请输入相连接的顶点:" << endl; //顶点从1开始
    for (int i = 0; i < e; i++)
	{
        int u, v;
        cin >> u >> v;
        G[u][v] = G[v][u] = 1;
    }
 
    if (dfs(1))
	{
        for (int i = 1; i <= n; i++) //顶点从1开始
		{
            cout << "结点 " << i << " 的颜色为: " << color[i] << endl;
        }
    }
    else
	{
        cout << "No solution" << endl;
    }
    return 0;
}

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

第14期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

【QML】vscode安装QML格式化插件方法

1. 安装插件 拓展 > 搜索qml > 找到QML Format >点击安装 2. 配置 打开settings.json文件 ctl shift p&#xff0c;然后搜索settings 修改settings.js内容 {...//添加以下内容// 根据自己电脑安装路径来填写qmlformat.exe的路径&#xff0c;注意转义符"\…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第五章 高效的多线程日志

“日志&#xff08;logging&#xff09;”有两个意思&#xff1a; 1.诊断日志&#xff08;diagnostic log&#xff09;。即log4j、logback、slf4j、glog、g2log、log4cxx、log4cpp、log4cplus、Pantheios、ezlogger等常用日志库提供的日志功能。 2.交易日志&#xff08;trasac…

2023MathorCup高校数模挑战赛B题完整解题代码教程

赛道 B&#xff1a; 电商零售商家需求预测及库存优化问题 问题背景&#xff1a; 电商平台存在着上千个商家&#xff0c;他们会将商品货物放在电商配套的仓库&#xff0c; 电商平台会对这些货物进行统一管理。通过科学的管理手段和智能决策&#xff0c; 大数据智能驱动的供应链…

【C++】多态 ③ ( “ 多态 “ 实现需要满足的三个条件 | “ 多态 “ 的应用场景 | “ 多态 “ 的思想 | “ 多态 “ 代码示例 )

文章目录 一、" 多态 " 实现条件1、" 多态 " 实现需要满足的三个条件2、" 多态 " 的应用场景3、" 多态 " 的思想 二、" 多态 " 代码示例 一、" 多态 " 实现条件 1、" 多态 " 实现需要满足的三个条件 &q…

网络原理的讲解

网络原理 重要性: 网络原理知识 1.工作中非常重要的理论知识,尤其是正在调试一些bug的时候. 2.面试中非常重要的考点. 3.学习中非常关键的难点. 网络原理这里,主要给大家介绍, TCP/IP协议 这里的关键协议. 按照这里的这四层,分别进行介绍(物理层不涉及) 应用层 是和程序猿打…

蓝桥杯 第 2 场算法双周赛 第4题 通关【算法赛】c++ 优先队列 + 小根堆 详解注释版

题目 通关【算法赛】https://www.lanqiao.cn/problems/5889/learning/?contest_id145 问题描述 小蓝最近迷上了一款电玩游戏“蓝桥争霸”。这款游戏由很多关卡和副本组成&#xff0c;每一关可以抽象为一个节点&#xff0c;整个游戏的关卡可以抽象为一棵树形图&#xff0c;每…

asp.net教务管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机毕业设计

一、源码特点 asp.net 教务管理信息系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 asp.net教务管理系统 应用技术&a…

基于SSM的高校图书馆设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

真机环境配置教程

1.下载安装包 https://developers.google.com/android/images 2.刷机教程 Xposed精品连载 | 一篇文章彻底搞定安卓刷机与Root 3.配置root

【VTK】关于VTK图像的系列功能

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文总结VTK中图像的系列功能&#xff0c;包括图像的导入&#xff08;读取&#xff09;、显示、交互和导出&#xff08;保存&#xff09;等。详细讲解VTK中提供的各种解决思路&#xff…

DreamTexture.js - 基于稳定扩散的3D模型自动纹理化开发包

DreamTexture.js 是面向 three.js 开发者的 3D 模型纹理自动生成与设置开发包&#xff0c;可以为 webGL 应用增加 3D 模型的快速自动纹理化能力&#xff0c;官方下载地址&#xff1a;DreamTexture.js自动纹理化开发包 。 图一为原始模型, 图二图三为贴图后的模型。提示词&#…

PN8370 超低待机功耗准谐振原边反馈交直流转换器 适用于5V 2A的充电器芯片

PN8370集成超低待机功耗准谐振原边控制器及650V高雪崩能力智能功率MOSFET&#xff0c;用于高性能、外围元器件精简的充电器、适配器和内置电源。 PN8370为原边反馈工作模式,可省略光耦和TL431。内置高压启动电路,可实现芯片空载损耗(230VAC)小于30mW。在恒压模式&#xff0c;采…

FindDiff_Qt找不同项目

文章目录 项目简介源代码widget.hwidget.cppwidget.ui配置文件找不同.json 项目简介 开发平台 win10Qt6.6msvc2022 简介 微信上有一些好玩的游戏, 找不同一种比较轻松有趣的游戏,也曾经在街机上被坑过N币, 玩了几次后,发现还是太难了,于是开始截屏放大,慢慢找,再然后就发展到截…

2023软件测试高频面试题

前言 今天&#xff0c;我们来整理与解析一些比较高频的测试行业面试题&#xff0c;大家可以通过面试题内的一些解析&#xff0c;再结合自己的真实工作经验来进行答题思路的提取、整理。 友情提示&#xff1a;硬背答案虽可&#xff0c;但容易翻车哦。 同时&#xff0c;我也准备…

【蓝桥杯选拔赛真题04】C++计算24数字游戏 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++计算24数字游戏 一、题目要求 1、编程实现 2、输入输出 二、算法分析

7、电路综合-基于简化实频的SRFT微带线巴特沃兹低通滤波器设计

7、电路综合-基于简化实频的SRFT微带线巴特沃兹低通滤波器设计 5、电路综合-超酷-基于S11参数直接综合出微带线电路图中已经介绍了如何从传输函数或S参数综合出电路图。 24、基于原型的切比雪夫低通滤波器设计理论&#xff08;插入损耗法&#xff09;中介绍了使用集总参数元件…

基于SSM的航班订票管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【Python · PyTorch】线性代数 微积分

本文采用Python及PyTorch版本如下&#xff1a; Python&#xff1a;3.9.0 PyTorch&#xff1a;2.0.1cpu 本文为博主自用知识点提纲&#xff0c;无过于具体介绍&#xff0c;详细内容请参考其他文章。 线性代数 & 微积分 1. 线性代数1.1 基础1.1.1 标量1.1.2 向量长度&…

PyTorch中grid_sample的使用方法

官方文档首先Pytorch中grid_sample函数的接口声明如下&#xff1a; torch.nn.functional.grid_sample(input, grid, modebilinear, padding_modezeros, align_cornersNone)input : 输入tensor&#xff0c; shape为 [N, C, H_in, W_in]grid: 一个field flow&#xff0c; shape为…