回溯法——图着色问题

276 阅读1分钟


算法描述



代码

#define m 5   //m个顶点
#define n 4   //n种颜色
int a[5][5] = { 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 };
int color[m] = { 0 };//存储m个顶点的着色选择,可以选择的颜色为1到n
int count = 0;
int check(int num)
{
	int i;
	for (i = 0; i<num; i++) 
	{          //前num个与第num相邻的点中,不能有冲突的颜色 
		if (a[num][i] == 1 && color[i] == color[num]) 
		{
			return 0;
		}
	}
	return 1;
}
void dfs(int num) 
{
	int i,count=0;
	if (num == m) {
		count++;          
		for (i = 0; i<m; i++)
			cout<<color[i];
		cout << endl;
		return;
	}
	for (i = 1; i <= n; i++)    //这里的i为颜色的种类,不是矩阵,不用从0开始
	{ 
		color[num] = i;
		if (check(num))
			dfs(num + 1);
	}
}
int main()
{
	int count=0;
	int i, j;
	dfs(0);
	cout<<count;
	return 0;
}