回溯法--图的m着色问题

news2024/11/20 7:11:28

问题描述

给定无向连通图和m种不同的颜色,用这些颜色为图G的各个顶点着色,每个顶点有一种颜色

是否有一种着色方法?使得图G中每条边的两个顶点有不同的颜色

这个问题就是图的m可着色判定问题

色数:如果有一个图最少需要m种颜色才能使得图中每条边连接的2个顶点有着不同的颜色,称m是这个图的色数。

著名的平面图的四色猜想就是图的m可着色判定问题的特殊情形,可平面图是什么?如果一个图的所有顶点和边都可以用某一种方式画在一个平面上,并且没有任何两条边相交,就成为可平面图。

四色猜想:

问题分析

变量声明

无向连通图G(V,E)用邻接矩阵a表示,a[ i ][ j ]=1表示i和j两个顶点之间存在一条边( i , j ),即( i , j )属于图G(V,E)的边集E。 否则,a[i][j]=0。

整数1,2,3,...,m表示m种不同的颜色

顶点i的颜色用x[ i ]表示。x[ i ]就是问题的解

解空间

解空间可以表示为一颗n+1高度的完全m叉树,第i层有m个儿子,每个儿子对应X[ i ]的一种可能性

第一层就是第一个顶点,第二层第二个顶点,...,第n+1层是最后一个顶点(叶子)。每个分支结点,都有m个儿子结点。最底层有个叶子结点。

回溯逻辑

剪枝--检查什么可行性?

可行的条件是yu当前点相邻的点不能与之同色

backtrack(int i)

完整代码

#include <iostream>
#include<cstring>
#include<math.h>
using namespace std;
int n;//图一共有n个顶点
int m;//m种颜色被选择
int k;//图中有k条边
int sum=0;//图的m着色种类
int x[101];//存放当前的着色序列{...}
int a[101][101];//图的邻接矩阵
//判断给点t着色为x[t]是否可行
bool OK(int t)
{
    //可行的条件是当前点相邻的点不能与之同色
    for(int i=1;i<t;i++)
        if(a[i][t]==1&&x[i]==x[t])
            return false;
    //如果所有与之相邻的点都不与之同色
    return true;
}
void backtrack(int i)
{
    if(i>n){//i>n说明找到了一个可行的涂色方案
        sum++;//涂色方案数++
        //这里可以选择性的输出解向量
        for(int k=1;k<=n;k++)
            cout<<x[i]<<" ";
        cout<<endl;
        return ;
    }
    //还没有到叶子节点,需要给当前节点可行的涂色
    else{
        for(int k=1;k<=m;k++){    //子树是一个m叉树
            x[i]=k;//给第i个顶点着第k种颜色
            if(OK(i))//剪枝
                backtrack(i+1);
            x[i]=0;//如果给第i个顶点着第k种颜色不可行
            //不涂色,便于后续涂色
        }
    }
    return ;//如果当前节点所有颜色都不可行,结束对子树的遍历,返回
}
int main()
{
    cin>>n>>k>>m;//输入定点数,边数,着色种类数
    int x,y;
    memset(a,0,sizeof(a));//给邻接矩阵赋初值
    for(int i=1;i<=k;i++){
        cin>>x>>y;
        a[x][y]=a[y][x]=1;//生成邻接矩阵
    }
    backtrack(1);
    cout<<"sum= "<<sum;//输出最大可行的着色方案数,sum初始值为0
    return 0;
}

测试用例

输入

输入定点数,边数,着色种类数

5 8 4

1 2

1 3

1 4

2 3

2 4

2 5

3 4

4 5

输出

48

P2819 图的 m 着色问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

又是一个子集树的回溯法,分析结束。还是很像模板的。

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

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

相关文章

国医大师体验照“镜”测“三高”,深兰科技AI产品秒出健康报告

“请把脸缓慢往左转。” “请将脸回正&#xff0c;请将脸缓慢往右转。” “请放松心情&#xff0c;期待3D面部的生成结果。” 跟随提示音&#xff0c;刚刚被聘任为深兰科技科学院专家委员会医学专家的国医大师严世芸教授饶有兴致地体验着深兰科技AI生理健康检测仪-扁鹊。等待一…

【位图】面对海量数据,如何压缩空间?定位数据?

目录 一、腾讯面试题 二、解决办法——位图 2.1、那么什么是位图&#xff1f; 三、位图的模拟实现 3.1、位图的构造 3.2、存放数据 3.3、检测数据是否存在 3.4、设置某个数据的对应位为0 四、位图模拟代码&#xff08;完整&#xff09; 一、腾讯面试题 给40亿个不重复…

Authing 入选 2022 中国产业数字化领军企业

1 月 10 日&#xff0c;产业互联网第一媒体产业家联合数字化报、IT 桔子正式发布了【中国产业数字化领军企业榜单】&#xff0c;评选出 16 个互联网赛道中的领军企业。作为身份认证与访问管理领跑者&#xff0c;Authing 凭借在 SaaS 领域的技术创新与产品优势&#xff0c;成功入…

6.4、域名系统 DNS

1、DNS的作用 如下所示&#xff0c;因特网中的某台主机要访问某台 Web 服务器 只需在用户主机中运行某个游览器软件&#xff0c;在其地址栏中输入要访问的 Web 服务器的域名&#xff0c;并按下回车键即可访问到 Web 服务器所提供的内容 我们在用户主机中使用 ping 命令测试 We…

【小练】day1

day1 选择题 1. 以下for循环的执行次数是&#xff08;&#xff09;。 for(x0,y0;(y123)&&(x<4););A 是无限循环 B 循环次数不定 C 4 D 3 本题主要考察for for(初始化部分&#xff1b;条件判断部分&#xff1b;调整部分) 初始化部分只执行一次。 &&&a…

大数据分析案例-基于多元线性回归算法构建广告投放收益模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

走好这三步,不再掉进云上安全的沟里!

序言一直以来&#xff0c;公有云安全是横亘在广大用户面前的一道鸿沟。云安全&#xff08;Cloud Security&#xff09;是指用于控制云计算的安全性、合规性和其他使用风险的过程、机制和服务。公有云提供商们都强调安全是其最高优先级工作&#xff0c;动辄就发布上百页的云上安…

谁还没个技术呢~PYTHON制作观看软件

前言 大家早好、午好、晚好吖 ❤ ~ 以前没钱时&#xff0c;我是这样嘚&#xff1a; 朋友说好一生一起走&#xff0c;账号先借我来耍耍 现在没钱时&#xff0c;我是这样嘚&#xff1a; 涨价就涨价&#xff0c;怎么还搞搞限制账号登录这一出呢~ 这年头~谁还没点技术不是,看我…

复盘一下slam中常用的几种点云类型

使用livox雷达常涉及至少3种点云格式&#xff0c;一个是livox官方定义的custom格式&#xff0c;另外两个就是激光、视觉常用的pcl类型和ros类型。之前总结过Livox雷达驱动程序发布点云格式CustomMsg和pcl::PointXYZI、pcl::PointXYZINormal之间的关系&#xff0c;现在再来复盘一…

【TypeScript】TS进阶-泛型(八)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff1a;vue3从入门到…

【Linux】工具使用

文章目录一、Linux 软件包管理器 yum二、 Linux开发工具&#xff08;1&#xff09; Linux编辑器-vim使用&#xff08;2&#xff09;简单vim配置三、Linux编译器-gcc/g使用四、动态库和静态库五、Linux调试器-gdb使用六、Linux项目自动化构建工具-make/Makefile(1)make/Makefile…

如何才能精通 Redis?

为什么我要讲 Redis&#xff1f; 已经出过这么多主题的书籍和课程了&#xff0c;这次我为什么要选择 Redis 这个主题呢&#xff1f; 那自然是因为 Redis 是我们实际开发中不可或缺的组件之一&#xff0c;也是目前全球最流行的 KV 数据库。相信小伙伴们在工作中也会频繁接触到…

【入门篇】2 # 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

说明 【数据结构与算法之美】专栏学习笔记。 为什么引入这些时间复杂度 先看下面代码 // n 表示数组 array 的长度 int find(int[] array, int n, int x) {int i 0;int pos -1;for (; i < n; i) {if (array[i] x) {pos i;break;}}return pos; }上面代码中如果没有 …

Redis序列化和java存入Redis数据序列化反序列化总结

背景&#xff1a; 最近考虑java代码数据在保存redis时&#xff0c;通常要配置序列化&#xff0c;才能保存到redis中&#xff0c;然而我们知道Redis中也有序列化&#xff08;RDB和AoF两种形式&#xff09;&#xff0c;有点混淆总结一下。 java中数据保存redis过程序列化的原因是…

图解:什么是二叉查找树?

文章目录1. 二叉查找树的概念2. 二叉查找树的实现&#x1f351; 定义节点&#x1f351; 函数接口总览&#x1f351; 构造函数&#x1f351; 拷贝构造&#x1f351; 赋值重载&#x1f351; 析构函数&#x1f351; 查找操作&#x1f345; 动图演示&#x1f345; 非递归实现&#…

【机器学习】线性回归(实战)

线性回归&#xff08;实战&#xff09; 目录一、准备工作&#xff08;设置 jupyter notebook 中的字体大小样式等&#xff09;二、构建实验所需的数据&#xff08;以下实验将基于此数据&#xff09;三、实现线性回归的两种方式方法一&#xff1a;通过直接求解得到拟合方程参数&…

Python金融风控模型案例实战大全

大家好&#xff0c;我是Toby老师&#xff0c;今天介绍 《Python金融风控模型案例实战大全》。 1.《Python金融风控模型案例实战大全》程覆盖多个核心知识点&#xff0c;包括风控建模全流程知识介绍&#xff0c;信用评分卡&#xff0c;信用评分卡知识包含个人信用评分卡和企业信…

ifconfig-显示和配置网络

ifconfig是linux中用于显示或配置网络设备&#xff08;网络接口卡&#xff09;的命令&#xff0c;英文全称是network interfaces configuring。配置网卡的IP地址语法例&#xff1a;ifconfig eth0 192.168.0.1 netmask 255.255.255.0 系统命令 语法 ifconfig [网络设备][down up…

读Go语言精进之路

主要是摘取书中&#xff0c;个人感觉比较重要的内容。 文章目录第一部分 熟知Go的一切理解Go的设计哲学使用Go语言原生编程思维写Go代码第二部分 项目结构、代码风格和标识符命名第三部分 声明、类型、语句与控制结构13 了解切片的底层原理14 了解Map实现原理并高效使用15. str…

Word处理控件Aspose.Words功能演示:在 C# .NET 中将 DOC/DOCX 转换为 PNG

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…