图的m着色问题

给定一个n顶点的无向图,每一个顶点涂一种颜色,最多有m种颜色。 要求相邻顶点涂不同的颜色。问有多少种涂色方案?

如下实例,如果用至多4种颜色去涂它,有多少种方案?

在这里插入图片描述
可以用回溯法解决此问题。每个顶点可能有4种涂色方案,共有5个顶点,因此解空间总共有 4 5 4^5 45种可能,除掉不符合要求的,最终结果如下:
在这里插入图片描述
代码如下:

#include <iostream>
#define MAX_V 100
using namespace std;

/* 图的m着色问题
 * map : 图的邻接矩阵
 * i   : 当前递归的层次
 * n   : 图的顶点个数
 * buf : 回溯缓冲区
 * m   : 颜色种类 [1, m]
 * nums: 解的个数
 * */
void done(int map[MAX_V][MAX_V], int i, int n, int buf[], int m, int& nums){
	if(i >= n){
		nums += 1;
		return;
	}

	for(int a = 0; a < m; a++){
		buf[i] = a + 1;
		//剪枝
		bool hasRepeated = false;
		for(int b = 0; b < i; b++){ //注意这里是i
			if(map[i][b] == 1 && buf[b] == buf[i]){
				hasRepeated = true;
				break;
			}
		}
		if(!hasRepeated){
			done(map, i + 1, n, buf, m, nums);
		}
	}
}

int main(){
	int map[MAX_V][MAX_V] = {0};
	int buf[5] = {0};
	int nums = 0;

	//构建图结构
	map[0][1] = map[1][0] = 1;
	map[0][2] = map[2][0] = 1;
	map[0][3] = map[3][0] = 1;
	map[1][2] = map[2][1] = 1;
	map[1][3] = map[3][1] = 1;
	map[1][4] = map[4][1] = 1;
	map[2][3] = map[3][2] = 1;
	map[3][4] = map[4][3] = 1;

	done(map, 0, 5, buf, 4, nums);
	cout << "solve count: " << nums << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值