1、问题
2、解析
int n, m;//顶点数n,着色数m
int a = 1, b = 1;//表示边的两个顶点
int total;//着色人方法的总数
int graph[20][20] = { 0 };//无向连通图
int color[20] = { 0 };//着色的颜色
判断是否继续着色,是回溯算法的关键,当两个顶点连通且颜色相同则不再继续
3、设计
void backtrack(int v) {
//给顶点v着色
//顶点编号已经超过总顶点个数,意味着一个着色方案已经形成,输出着色方案,总数+1
if (v > n) {
for (int i = 1; i <= n; i++) {
cout << color[i]<<" ";
}
total++;
cout << endl;
}
//如果未形成完整的着色方案,判断是否继续着色
else {
for (int i = 1; i <= m; i++) {
color[v] = i;
if (ok(v)) {
backtrack(v + 1);
}
color[v] = 0;
}
}
}
4.分析
最坏时间复杂度(m*n²)
5. 源码
源码地址:https://github.com/ACynj/draw.git