匿名用户

1级

2006-05-17 回答

给出一个图的m-着色的程序段,回溯法:

/* 图的邻接矩阵Graph[n,n]表示无向连通图G,

1,2,3,..m代表不同的颜色

顶点i所着色用x[i]表示,初始值都赋为0

*/

void NextValue(int k)

{

int j, flag;

do{

x[k] = (x[k]+1) % (m + 1)//分配给x[k]一种新的颜色

if (x[k] == 0)

return; //x[k]的颜色已用完

flag = 1; //x[k]是否可用的标记

for (j = 0; j < n; j++)

if (Graph[k,j] == 1 && x[k] == x[j]){

flag = 0; //x[k]不可用

break;

}

while (flag);

}

void MColoring(int k)

{

while (x[k] < m){ //产生x[k]的合理分配

NextValue(k); //找x[k]的一个合理分配

if (x[k] == 0)

return; //无解,结束调用

if (k == n) { //着完n个顶点,找到完整着色法,输出

Output(x,k) //输出当前解

else

MColoring(k+1)

}

}

/*

递归算法:

void Coloring(区域 n)

1. 令颜色集ClrSet={ 没有被区域n的邻居区域使用的颜色 }.

2. 如果ClrSet是空集,返回.

3. 对ClrSet中的每种颜色c,作循环:

3.1 为区域n着色c。

3.2 如果所有区域都已着色(n是最后一个区域),那么显示/保存着色结果.

3.3 否则对下一个尚未着色的区域(n+1),调用Coloring(n+1).

4. 把区域n变为没有着色的区域.

--------------------------------------------------------

*/

template

class CColoring

{

private:

typedef int node_type;

typedef int color_type;

typedef std::set node_set;

typedef std::vector color_array;

public:

void operator()(const int _Matrix[node_count][node_count])

{

matrix = _Matrix;

colors_of_nodes.resize(node_count, 0);

total_count = 0;

coloring(0);

}

private:

void coloring(node_type n)

{

// 颜色的使用情况

std::vector used_colors;

node_type m;

color_type c;

// 初始化颜色的使用情况

used_colors.resize(color_count, false);

// 遍历每个与区域n相邻的区域m

for(m = 0; m < node_count; ++m)

{

if(matrix[n][m])

{

// 获取m的颜色

c = colors_of_nodes[m];

// m已着色

if(c != 0)

used_colors[c] = true;

}

}

// 遍历每个未被n的邻居使用的颜色c

for(c = 1; c < color_count; ++c)

{

if(!used_colors[c])

{

// 为n着色c

colors_of_nodes[n] = c;

// 着色完毕

if(n >= node_count - 1)

{

++total_count;

// 输出结果

_tprintf(_T("---------------------\n"));

_tprintf(_T("Method %d:\n"), total_count);

for(m = 0; m < node_count; ++m)

{

_tprintf(_T("node: %d, color: %d\n"), m, colors_of_nodes[m]);

}

}

// 还有区域没有着色

else

{

// 为下一个未着色的区域,调用coloring()

coloring(n + 1);

}

}

}

// 将n设置为没有着色的区域

colors_of_nodes[n] = 0;

}

// 0表示无色,1-4表示4种不同颜色

static const int color_count = 5;

// 邻接矩阵

const int (* matrix)[node_count];

// 各区域对应的颜色

color_array colors_of_nodes;

// 总的着色方案数

int total_count;

};

void main()

{

int Matrix[4][4] =

{

{ 0, 1, 0, 0 },

{ 1, 0, 0, 0 },

{ 0, 0, 0, 1 },

{ 0, 0, 1, 0 },

};

CColoring<4> coloring;

coloring(Matrix);

}

C语言递归实现四色定理,实现四色定理的C++程序相关推荐

  1. c语言线索二叉树作用,C语言递归实现线索二叉树

    本文实例为大家分享了C语言递归实现线索二叉树的具体代码,供大家参考,具体内容如下 描述:将二叉树中结点的空左孩子指针域指向前驱结点,将空的右孩子指针域指向后继结点. code: #pragma war ...

  2. 汉塔克问题(C语言递归)

    汉塔克问题(C语言递归) 操作步骤 代码 操作步骤 当n为1时直接将盘子从第一个柱子移动到第三个柱子. 当 n>1时,先借助第三个柱子将n-1个盘子移动到第二个柱子,然后将第n个盘子从第一个柱子 ...

  3. C语言递归实现深度优先搜索DFS算法(附完整源码)

    C语言递归实现DFS算法 完整Graph.h 头文件 完整Graph.c 源文件文件 完整dfs_recursive.c 源文件(main测试函数) 完整Graph.h 头文件 #include &l ...

  4. C语言递归遍历一棵二叉树(附完整源码)

    C语言递归遍历一棵二叉树 结点结构体定义 二叉树递归遍历方式 完整实现和main测试源码 结点结构体定义 struct node {struct node *leftNode;int data;str ...

  5. c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑

    c语言递归解决汉诺塔参数变化的疑惑 答案:3  信息版本:手机版 解决时间 2020-04-05 14:20 已解决 2020-04-05 10:49 #include void main() {vo ...

  6. c语言递归解决汉诺塔问题

    c语言递归解决汉诺塔问题 参考文章: (1)c语言递归解决汉诺塔问题 (2)https://www.cnblogs.com/didiaoxiaoguai/p/6686407.html 备忘一下.

  7. 【汉诺塔】C语言递归解法,深层次地带你理解汉诺塔公式

    目录 汉诺塔公式 汉诺塔问题在数学层面的公式: C语言递归公式 两层汉诺塔 三层汉诺塔 递归问题可谓是学习C语言以来的第一个拦路虎,而汉诺塔问题更是递归中对新手很不友好的一道经典题,我们接下来从公式角 ...

  8. C++语言递归实现求从n个数中选k个进行组合的组合数

    C++语言递归实现求从n个数中选k个进行组合的组合数 公式: 需要注意结束条件和递推公式的使用. 递归需要用到函数的思想,此处定义一个fun()函数用于求组合数,记住,一旦调用fun()函数,如:fu ...

  9. C语言 | 递归将一个整数n转换成字符串

    例73:C语言用递归方法将一个整数n转换成字符串.例如,输入483,应输出字符串"483",n的位数不确定i,可以是任意位数的整数. 解题思路:如果是负数,要把它转换为正数,同时为 ...

  10. c语言递归的用法,C语言递归操作用法总结

    本文实例总结了C语言递归操作用法.分享给大家供大家参考,具体如下: 用归纳法来理解递归 步进表达式:问题蜕变成子问题的表达式 结束条件:什么时候可以不再是用步进表达式 直接求解表达式:在结束条件下能够 ...

最新文章

  1. 用好 Spring AOP,天降大锅从容应对!
  2. python使用fpdf的multi_cell API实现长文本写入的自动换行功能实战
  3. 第四维、第五维空间狂想
  4. 设计模式(五)行为型模式
  5. C#LeetCode刷题之#633-平方数之和( Sum of Square Numbers)
  6. Intel® Nehalem/Westmere架构/微架构/流水线 (9) - 系统软件增强/能耗增强
  7. hadoop hive集群_Hive的优化和压缩
  8. 执行计划有时不准确_高效学习计划的制定原则和分类执行方法
  9. MS SQL SERVER 读取数据库中每个表的描述/注释以及表中字段/列的字段名,字段类型,字段描述/注释/说明等信息...
  10. c语言 一个矩阵的乘积,c语言矩阵相乘
  11. 人力节省 50%,研发效能提升 40%,阿里 Serverless 架构落地实践
  12. 2018网易校招前端笔试考后总结
  13. java对日期设置时间和对日期加减周
  14. 火星坐标系(高德)和84坐标系互换
  15. 在.net Core中使用StackExchange.Redis 2.0
  16. 知识图谱文献综述(第二章 知识表示学习)
  17. 数据结构与算法——赫夫曼树基本实现
  18. (转载)(官方)UE4--图像编程----着色器开发----HLSL 交叉编译器
  19. 电赛初探(一)——正弦波、方波、锯齿波转换
  20. 字节顺序:大端模式 和 小端模式

热门文章

  1. CSS 2D 转换 transform translate() rotate() scale() skew() matrix()
  2. 金额大小写转化、阿拉伯数字转大写数字,大写数字转阿拉伯数字
  3. linux通过iphone usb上网,Ubuntu下iphone拖电脑上网
  4. 区块链学习笔记19——ETH难度调整
  5. Emotion Expression With Fact Transfer for Video Description基于事实传递的视频描述情感表达
  6. RBP系统管理之服务器参数管理
  7. 最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )
  8. 优惠券测试点和测试用例
  9. 智能手持终端CPU选型报告
  10. 测试开发面试(八)——进程与线程、python数据结构、数据库