解空间:子集树
题目比较容易,直接附代码
代码
#include <iostream>
using namespace std;
int n; //图的顶点数
int x[100]; //当前解
int a[100][100]; //邻接矩阵
int m; //可用颜色数量
int sum = 0; //当前已经找到的可m着色方案数
bool OK(int t)
{
for (int i = 1; i < t;i++)
{
if(a[t][i]==1&&x[t]==x[i]) //将当前扩展结点与已加入顶点集的顶点逐一比较,当两顶点有边且颜色相同返回错误
return false;
}
return true;
}
void Backtrack(int t)
{
if(t>n) //搜索到叶子节点
{
sum++;
for (int i = 1; i <= n;i++)
cout << x[i] << " ";
cout << endl;
}
else
{
for (int i = 1; i <= m;i++)
{
x[t] = i;
if(OK(t))
Backtrack(t + 1);
x[t] = 0;
}
}
}
int main()
{
cout << "请输入顶点数和着色数" << endl;
cin >> n >> m;
cout << "请输入邻接矩阵" << endl;
for (int i = 1; i <= n;i++)
for (int j = 1; j <= n;j++)
cin >> a[i][j];
cout << "着色所有可能的解:\n";
Backtrack(1);
cout << "着色可能解的总数为:" << sum << endl;
return 0;
}