本文参考https://blog.csdn.net/kevin_cyj/article/details/50385575

问题描述与思想概述
(1)、问题的提出
       给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。

输入:无向图,m

输出:如果能,则输出方案

四色问题是m图着色问题的一个特例,根据四色原理,证明平面或球面上的任何地图的所有区域都至多可用四种颜色来着色,并使任何两个有一段公共边界的相邻区域没有相同的颜色。这个问题可转换成对一平面图的4-着色判定问题(平面图是一个能画于平面上而边无任何交叉的图)。将地图的每个区域变成一个结点,若两个区域相邻,则相应的结点用一条边连接起来。多年来,虽然已证明用5种颜色足以对任一幅地图着色,但是一直找不到一定要求多于4种颜色的地图。直到1976年这个问题才由爱普尔,黑肯和考西利用电子计算机的帮助得以解决。他们证明了4种颜色足以对任何地图着色。

(2)、问题的处理
如果把每一个区域收缩为一个顶点,把相邻两个区域用一条边相连接,就可以把一个区域图抽象为一个平面图。

用m种颜色为图中的每个顶点着色,要求每个顶点着一种颜色,并使相邻两顶点之间有着不同的颜色

如图:

一个例子

着色问题的解空间树为:

可以看到约束函数为:i点有m种着色可能性,但若与某个已着色的点相连且颜色相同,则不选择这种着色可能性

3、练习题

https://www.luogu.org/problem/P2819

代码:

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int n;//n个节点
int m;//m种颜色
int mm[100][100];//记录图的邻接矩阵
int x[100];//记录树的一条枝,即图着色的一种可能性,x[i]=1,2,3..k..n代表第节点i颜色为k
int bestx[100];
int sum=0;//用来记录当前可行的着色方案
//分析本题的约束函数为两节点相连且同种颜色时,不会继续往下发展这种可能性
bool ok(int i)
{int j;for(j=1;j<=n;j++){if((mm[i][j]==1)&&(x[i]==x[j]))//我到底和哪些节点相连且颜色一样{return false;}}return true;
}
void dfs(int i)
{int j;if(i>n){sum++;for(j=1;j<=n;j++){bestx[j]=x[j];//记录一条枝(记录一种着色的可能性)}}else{for(j=1;j<=m;j++)//在i节点处检测它自己可能填的m种可能性{x[i]=j;//i节点选定了一种颜色if(ok(i))//通过约束函数去掉不合理的颜色可能性{dfs(i+1);//活节点转移到下一层的第i+1个节点}x[i]=0;//无实义,为i继续换别的颜色可能性}}
}
int main()
{int t,k;int i,j;scanf("%d %d %d",&n,&k,&m);//k是k条边for(t=0;t<k;t++){scanf("%d %d",&i,&j);mm[i][j]=1;mm[j][i]=1;}dfs(1);printf("%d",sum);return 0;
}

回溯法-图的m着色问题相关推荐

  1. 回溯法----图的着色问题

    图的着色问题 1.问题描述 图的m-着色判定问题--给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色? 图的m-着 ...

  2. 回溯法求解图着色问题

    回溯法求解图着色问题 #include <iostream> #include <cstdlib> using namespace std; #define n 5 #defi ...

  3. 图着色问题回溯法(最通俗易懂)

    图着色问题描述: 对于给定无向连通图G=(V,E),求至少用多少种颜色对G中的顶点进行着色,使得任意两个顶点的着色不同. 回溯法描述: 回溯法的本质其实就是一种蛮力法,只是通过一定的方法可以使得蛮力法 ...

  4. 图的m着色问题——回溯法及其优化(变量排序MRV, 值排序MCV, 前向检查ForwardChecking, 智能回溯, 边相容,K阶相容)python C++实现

    文章目录 图的m着色问题背景 背景知识 问题描述 回溯法的原理及其实现 回溯法基本思想 朴素回溯法解决图的m着色问题 回溯优化策略 回溯法优化--变量排序MRV 回溯法优化--值排序MCV 回溯法优化 ...

  5. java 着色问题 回溯算法,C语言使用回溯法解旅行售货员问题与图的m着色问题

    旅行售货员问题 1.问题描述: 旅行售货员问题又称TSP问题,问题如下:某售货员要到若干个城市推销商品,已知各城市之间的路程(或旅费),他要选定一条从驻地出发,经过每个城市一遍最后回到驻地的路线,使总 ...

  6. 算法设计与分析——第五章回溯法 批处理作业调度 + 最大团问题+图的m着色问题

    文章目录 6.批处理作业调度(排列树) 7.最大团问题 8.图的m着色问题 6.批处理作业调度(排列树) 每一个作业Ji都有两项任务分别在2台机器上完成.每个作业必须先有机器1处理,然后再由机器2处理 ...

  7. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  8. 递归、回溯-图的m着色问题

    1.问题描述 给定无向连通图G=(V,E)和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色. 是否有一种着色法使G中每条边的2个顶点着不同颜色.这个问题是图的m可着色判定问题. 输入 ...

  9. 回溯法求解K图染色问题(java版)

    回溯法:K图着色问题 问题描述: 问题分析: 伪代码: 局限性 具体实现 问题描述: 对如图 1 所示的图,采用局部搜索算法,求其对应的 3 着色方案. 问题分析: 题目的目标是用3种颜色,将图1中的 ...

最新文章

  1. python通过端口和协议查出服务名
  2. SSM中进行注解式和XML配置式事务管理
  3. 字符的用意_通达信某些字符的意义及用法
  4. SQL优化的若干原则
  5. Photoshop阴影与内阴影
  6. 数据库恢复相关知识笔记
  7. .NET 容器环境下创建应用 dump 文件
  8. linux内核3.14.4,Linux内核4.14.14,4.9.77,4.4.112和3.18.92更新发布
  9. 单片机 串口 波特率 c语言 9600 11.0592mhz t1,PLC与单片机串口通信的实现
  10. 干货收藏!一文看懂8个常用Python库从安装到应用
  11. 腾讯游戏安全报告:定制外挂占比过半 游戏黑产资产惊人
  12. 排序序列排序算法总结(二)——快速排序、归并排序
  13. python数字图像处理(11):图像自动阈值分割
  14. 安卓pdf阅读器_2020年双十一有哪些电纸书、电子书阅读器值得买?Kindle、掌阅、文石、科大讯飞哪个好?...
  15. 大喇叭疫情防控广播解决方案
  16. 无线联网常见问题[1]-搜不到无线网络(请先耐心看完)
  17. python中if in是什么意思_python中的in是什么意思
  18. c++ vector 一部分_要去|原创TheShy要去SKT、小C会给阿水打辅助!各大战队面临重新洗牌...
  19. 麒麟Linux启动目录,Ubuntu Kylin优麒麟文件管理器篇:介绍,类别,结构,文件系统目录,使用...
  20. Gluster的配置及离线安装

热门文章

  1. [ue4] 着色器绑定(Shader Binding)
  2. Meteorographica:一个用Python绘制天气图的气象代码库
  3. SiteMesh3的基本使用
  4. 本草中国-----境界
  5. qt中QPixmap和QImage使用
  6. 如何用命令批量重命名文件
  7. SSR存在时无法打开Microsoft Store等UWP应用
  8. InfluxDB CQ时间偏移
  9. AmchartsFlash图表配置-中文说明
  10. 远程登陆windows设置分辨率