C语言递归实现四色定理,实现四色定理的C++程序
匿名用户
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++程序相关推荐
- c语言线索二叉树作用,C语言递归实现线索二叉树
本文实例为大家分享了C语言递归实现线索二叉树的具体代码,供大家参考,具体内容如下 描述:将二叉树中结点的空左孩子指针域指向前驱结点,将空的右孩子指针域指向后继结点. code: #pragma war ...
- 汉塔克问题(C语言递归)
汉塔克问题(C语言递归) 操作步骤 代码 操作步骤 当n为1时直接将盘子从第一个柱子移动到第三个柱子. 当 n>1时,先借助第三个柱子将n-1个盘子移动到第二个柱子,然后将第n个盘子从第一个柱子 ...
- C语言递归实现深度优先搜索DFS算法(附完整源码)
C语言递归实现DFS算法 完整Graph.h 头文件 完整Graph.c 源文件文件 完整dfs_recursive.c 源文件(main测试函数) 完整Graph.h 头文件 #include &l ...
- C语言递归遍历一棵二叉树(附完整源码)
C语言递归遍历一棵二叉树 结点结构体定义 二叉树递归遍历方式 完整实现和main测试源码 结点结构体定义 struct node {struct node *leftNode;int data;str ...
- c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑
c语言递归解决汉诺塔参数变化的疑惑 答案:3 信息版本:手机版 解决时间 2020-04-05 14:20 已解决 2020-04-05 10:49 #include void main() {vo ...
- c语言递归解决汉诺塔问题
c语言递归解决汉诺塔问题 参考文章: (1)c语言递归解决汉诺塔问题 (2)https://www.cnblogs.com/didiaoxiaoguai/p/6686407.html 备忘一下.
- 【汉诺塔】C语言递归解法,深层次地带你理解汉诺塔公式
目录 汉诺塔公式 汉诺塔问题在数学层面的公式: C语言递归公式 两层汉诺塔 三层汉诺塔 递归问题可谓是学习C语言以来的第一个拦路虎,而汉诺塔问题更是递归中对新手很不友好的一道经典题,我们接下来从公式角 ...
- C++语言递归实现求从n个数中选k个进行组合的组合数
C++语言递归实现求从n个数中选k个进行组合的组合数 公式: 需要注意结束条件和递推公式的使用. 递归需要用到函数的思想,此处定义一个fun()函数用于求组合数,记住,一旦调用fun()函数,如:fu ...
- C语言 | 递归将一个整数n转换成字符串
例73:C语言用递归方法将一个整数n转换成字符串.例如,输入483,应输出字符串"483",n的位数不确定i,可以是任意位数的整数. 解题思路:如果是负数,要把它转换为正数,同时为 ...
- c语言递归的用法,C语言递归操作用法总结
本文实例总结了C语言递归操作用法.分享给大家供大家参考,具体如下: 用归纳法来理解递归 步进表达式:问题蜕变成子问题的表达式 结束条件:什么时候可以不再是用步进表达式 直接求解表达式:在结束条件下能够 ...
最新文章
- 用好 Spring AOP,天降大锅从容应对!
- python使用fpdf的multi_cell API实现长文本写入的自动换行功能实战
- 第四维、第五维空间狂想
- 设计模式(五)行为型模式
- C#LeetCode刷题之#633-平方数之和( Sum of Square Numbers)
- Intel® Nehalem/Westmere架构/微架构/流水线 (9) - 系统软件增强/能耗增强
- hadoop hive集群_Hive的优化和压缩
- 执行计划有时不准确_高效学习计划的制定原则和分类执行方法
- MS SQL SERVER 读取数据库中每个表的描述/注释以及表中字段/列的字段名,字段类型,字段描述/注释/说明等信息...
- c语言 一个矩阵的乘积,c语言矩阵相乘
- 人力节省 50%,研发效能提升 40%,阿里 Serverless 架构落地实践
- 2018网易校招前端笔试考后总结
- java对日期设置时间和对日期加减周
- 火星坐标系(高德)和84坐标系互换
- 在.net Core中使用StackExchange.Redis 2.0
- 知识图谱文献综述(第二章 知识表示学习)
- 数据结构与算法——赫夫曼树基本实现
- (转载)(官方)UE4--图像编程----着色器开发----HLSL 交叉编译器
- 电赛初探(一)——正弦波、方波、锯齿波转换
- 字节顺序:大端模式 和 小端模式
热门文章
- CSS 2D 转换 transform translate() rotate() scale() skew() matrix()
- 金额大小写转化、阿拉伯数字转大写数字,大写数字转阿拉伯数字
- linux通过iphone usb上网,Ubuntu下iphone拖电脑上网
- 区块链学习笔记19——ETH难度调整
- Emotion Expression With Fact Transfer for Video Description基于事实传递的视频描述情感表达
- RBP系统管理之服务器参数管理
- 最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )
- 优惠券测试点和测试用例
- 智能手持终端CPU选型报告
- 测试开发面试(八)——进程与线程、python数据结构、数据库