题目:对于给定的无向图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