图的m着色问题

给定无向连通图和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的两个顶点有不同的颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边相连接的两个顶点着不同颜色,称这个数m为这个图的色数。求一个图的色数m称为图的m可着色优化问题。 

给定一个图以及m种颜色,请计算出涂色方案数。

#include<stdio.h>
//#define n 5//块数
//#define m 3//颜色数 
//int a[n][n] = {
//0,1,1,1,0,
//1,0,1,1,1,
//1,1,0,1,0,
//1,1,1,0,1,
//0,1,0,1,0	
//};
#define n 4
#define m 3
int a[n][n] = {
0,1,0,1,
1,0,1,0,
0,1,0,1,
1,0,1,0
}; 
int color[n];//0表示还没有涂颜色,其他数字表示涂得几号颜色 
int count = 0;
bool ok(int t){
	int i;
	for(i = 0;i < n;i ++){//可以 n的原因的是,nfs中已经对 color[t] = 0进行了赋值,并且当i=t的时候,下面的if是不满足条件的 
		if(color[t] == color[i] && a[i][t] == 1){ 
			return false;
		}
	}
	return true;
}
void nfs(int t){
	int i;
	if(t == n){ 
		count ++;
		return;
	}
	for(i = 1;i <= m;i ++){
		color[t] = i;
		if(ok(t)){//判断当前的所有着色中是不是有相邻的块用了同一种颜色 
			nfs(t + 1);	
		}
		color[t] = 0;
	}
} 
int main()
{
	nfs(0);
	printf("%d\n",count);
	return 0;
}


猜你喜欢

转载自blog.csdn.net/iamjingong/article/details/69393429