图的m着色问题【带分析和注释】

本文分析了如何用回溯法解决给定无向图的m着色问题,确保每条边的两个顶点颜色不同。通过递归地尝试给顶点涂色并检查条件来寻找可行的涂色方案。
摘要由CSDN通过智能技术生成

题目:对于给定的无向图G和m种颜色,用这些颜色为图G的各顶点涂色,每个顶点涂一种颜色。是否存在一个方法,使得G中每条边的2个顶点是不同的颜色
分析:
根据题意,所要满足的条件是:用已有的m种颜色,涂图G的各个顶点,并且使得有边相连的顶点有不同的颜色。
利用回溯法,当到达叶子节点,方案数+1,并且输出该方案;没到叶子节点,就将顶点依次涂4种颜色,然后去判断是否满足条件,如果满足进入下一个顶点
注意录入邻接矩阵时自身节点要标记为0,
即G[1][1]=0;

//图的m色问题 
//注:顶点自身 邻接矩阵是要标记为0 
#include<iostream>
#include<cstring>
using namespace std;
#define N 6
int sum=0;//方案数
int n;//顶点的个数 
int m;//颜色的种类 
int x[N];//记录各个顶点颜色的数组 
int G[N][N]={0,0,0,0,0,0,//顶点自身为0 因为ok函数判断时每个都要判断 自身情况肯定一样 将会导致错误 
             0,0,1,1,1,0,
             0,1,0,1,1,1,
             0,1,1,0,1,0,
             0,1,1,1,0,1,
             0,0,1,0,1,0
};
bool ok(int k){
	for(int j=1;j<=n;j++)//n? 
	if((G[k][j]==1)&&(x[k]==x[j]))//两个顶点有边相连 并且顶点的颜色相同
		return false; 
	return true; 
} 
void dfs(int k){
	if(k
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值