算法分析第十二次作业-回溯算法-m着色问题

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值