1.问题.
2.解析
3.设计
每次确定一个点的颜色, 先表示两点之间的关系和颜色。用m种颜色为无向图G=(V,E)着色,其中,V的顶点个数为n,可以用一个n元组x=(col1,col2,…,coln)来描述图的一种可能着色,其中,xi∈{1, 2,…, m},(1≤i≤n)表示赋予顶点i的颜色。例如,5元组(1, 2, 2, 3, 1)表示对具有5个顶点的无向图(a)的一种着色,顶点A着颜色1,顶点B着颜色2,顶点C着颜色2,如此等等。如果在n元组X中,所有相邻顶点都不会着相同颜色,就称此n元组为可行解,否则为无效解。容易看出,每个顶点可着颜色有m种选择,n个顶点就有mn种不同的着色方案,问题的解空间是一棵高度为n的完全m叉树,这里树高度的定义为从根节点到叶子节点的路径的长度。每个分支结点,都有m个儿子结点。最底层有mn个叶子结点。
void ff(int t) {
if (t > n) {
ans++;
return;
}
for (int i = 1; i <= m; i++) {
bool flag = 1;
for (int j = 1; j <= n; j++) {
if (mp[t][j] != -1 && i == mp[t][j]) {
flag = 0;
break;
}
}
if (flag) {
for (int j = 1; j <= n; j++) {
if (mp[t][j] != -1 && j != t) {
mp[j][t] = i;
}
}
ff(t + 1);
for (int j = 1; j <= n; j++) {
if (mp[t][j] != -1 && j != t) {
mp[j][t] = 0;
}
}
}
}
}
4.分析
时间复杂度:O(m*n^2)。
5.源码
https://github.com/Lillyooo/-Lily/blob/main/lab12.cpp