图的m着色问题
给定无向连通图G和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G种每条边的2个顶点着不同颜色,这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数的问题称为图的m可着色优化问题。
测试用例:
n = 4,m = 3,a[3][3] = {0, 1, 1, 1; 1, 0, 1, 1; 1, 1, 0, 0; 1, 1, 0, 0};
x = [1, 2, 3, 3]
问题分析:
对连通图顶点着色,两点之间分有边和无边两种情况。若有边,则两点不能着相同的颜色。这是题目限制条件,同时也是本算法的约束条件。
m着色问题的解空间树是确定元素某种性质排列的排列树。所以只需要在深度优先搜索的基础上判断是否满足约束条件即可,到达叶子结点即给出一种着色方案。
c++实现:
#include<iostream>
#include<algorithm>
using namespace std;
#define N 10
struct Node{
int m;
};
int g[N][N];//图的邻接矩阵
int sum = 0;//总着色方法数
Node nodes[N];
bool Ok(int i, int n){
//检查约束条件
for(int k =