图的m着色问题(回溯法)

1.问题
图的 m 着色问题。给定无向连通图 G 和 m 种颜色,用这些颜色给图
的顶点着色,每个顶点一种颜色。如果要求 G 的每条边的两个顶点着不
同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。

2.解析
设 G 有 n 个顶点,将顶点编号为 1,2,…,n,则搜索空间为深度 n 的 m
叉完全树,将颜色编号为 1,2,…,m,结点<x1,x2,…,xn>(x1,x2,…,xk)∈{1,…,m},1<=k<=n)表示顶点k的颜色xk

3.设计
在这里插入图片描述

设图G=(V, E), |V|=n, 颜色数= m, 用邻接矩阵a表示G, 用整数1, 2…m来表示

m种不同的颜色。顶点i所着的颜色用x[i]表示。

问题的解向量可以表示为n元组x={ x[1],…,x[n] }. x[i]∈{1,2,…,m},

解空间树为排序树,是一棵n+1层的完全m叉树.

在解空间树中做深度优先搜索, 约束条件:如果a[j][i]=1 , x[i] ≠ x[j]

回溯法:
void Backtrack(int a)
{
if 点数>总点数大
前n个点都涂完了,输出所有点,为一个方案
else
{
For 颜色i= 1to 颜色数
当前a点着色颜色i
if a点着色合法
继续涂
不合法就改涂另一个颜色
}
}
举例edgenum=5,n=4,m=3
顶点数量n=4, 色数:m=3
在这里插入图片描述
m=4,n=3时的解空间树
在这里插入图片描述

X[1]←1 , 返回 true
X[2]←1, 返回false; X[2]←2, 返回 true
X[3]←1 ,返回false; X[3]←2, 返回false;X[3]←3, 返回 true
X[4]←1, 返回false; X[4]←2, 返回false;X[4]←3, 返回 true

着色方案:(1,2,3,3)
4.分析
在这里插入图片描述

5.源码
https://github.com/Marvisss/Backtrack/blob/main/%E5%9B%BE%E7%9A%84m%E7%9D%80%E8%89%B2%E9%97%AE%E9%A2%98

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值