回溯法-图的m着色问题
本文参考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.问题描述 图的m-着色判定问题--给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色? 图的m-着 ...
- 回溯法求解图着色问题
回溯法求解图着色问题 #include <iostream> #include <cstdlib> using namespace std; #define n 5 #defi ...
- 图着色问题回溯法(最通俗易懂)
图着色问题描述: 对于给定无向连通图G=(V,E),求至少用多少种颜色对G中的顶点进行着色,使得任意两个顶点的着色不同. 回溯法描述: 回溯法的本质其实就是一种蛮力法,只是通过一定的方法可以使得蛮力法 ...
- 图的m着色问题——回溯法及其优化(变量排序MRV, 值排序MCV, 前向检查ForwardChecking, 智能回溯, 边相容,K阶相容)python C++实现
文章目录 图的m着色问题背景 背景知识 问题描述 回溯法的原理及其实现 回溯法基本思想 朴素回溯法解决图的m着色问题 回溯优化策略 回溯法优化--变量排序MRV 回溯法优化--值排序MCV 回溯法优化 ...
- java 着色问题 回溯算法,C语言使用回溯法解旅行售货员问题与图的m着色问题
旅行售货员问题 1.问题描述: 旅行售货员问题又称TSP问题,问题如下:某售货员要到若干个城市推销商品,已知各城市之间的路程(或旅费),他要选定一条从驻地出发,经过每个城市一遍最后回到驻地的路线,使总 ...
- 算法设计与分析——第五章回溯法 批处理作业调度 + 最大团问题+图的m着色问题
文章目录 6.批处理作业调度(排列树) 7.最大团问题 8.图的m着色问题 6.批处理作业调度(排列树) 每一个作业Ji都有两项任务分别在2台机器上完成.每个作业必须先有机器1处理,然后再由机器2处理 ...
- DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总
DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...
- 递归、回溯-图的m着色问题
1.问题描述 给定无向连通图G=(V,E)和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色. 是否有一种着色法使G中每条边的2个顶点着不同颜色.这个问题是图的m可着色判定问题. 输入 ...
- 回溯法求解K图染色问题(java版)
回溯法:K图着色问题 问题描述: 问题分析: 伪代码: 局限性 具体实现 问题描述: 对如图 1 所示的图,采用局部搜索算法,求其对应的 3 着色方案. 问题分析: 题目的目标是用3种颜色,将图1中的 ...
最新文章
- php二进制整数相加怎么解决_PHP两个n位的二进制整数相加问题的解决
- linux shell 查看 cpu核数
- 12月20日学习内容整理:博客系统之media配置
- 29. 栈的push,pop序列
- C++中实现 time_t, tm 相互转换
- c语言 通过sendarp 实现mac,C#通过SendARP()获取WinCE设备的Mac网卡物理地址
- 区分错误类型_牛鹭学院:Bug类型解析及其常见实例介绍
- cacti yum快速部署
- php mkdir创建多级目录
- 指数基金之父Bogle为指数基金敲响了警钟
- 推荐5个免费的项目管理工具
- linux设置python环境变量
- 台式计算机有乱码如何解决,电脑乱码怎么办,开机乱码解决方法
- 计算机桌面图标怎么显示出来,显示桌面图标不见了怎么办?显示桌面图标不见了解决方法...
- 传奇私服中检查人物穿戴指定装备的两种方法
- cesesesese
- 麒麟操作系统V10安装达梦数据库
- UART串口DB9的连接
- springbootvue电影购票网站
- cannot get gid for group ‘nobody’
热门文章
- wpa_supplicant的log中四次握手分析
- OpenCV中将Mat RGBA4通道转换成RGB3通道
- 如何通过postman生成接口测试脚本
- 虚拟机交叉编译openCV详细步骤及bug解决详解
- 2023年东南大学物理学考研考情与难度、参考书及上岸前辈备考经验
- 验证中文名字---正则表达式
- 海康威视摄像头使用网线连网输入IP地址跳转显示“网站处于联机状态,但未对联机尝试做出反应”
- java sca_用于Java的SCA客户机和实现模型
- Python爬虫实战+Scrapy框架 爬取当当网图书信息
- CentOS7系统编码