图的m可着色优化回溯法c语言,回溯法实验(图的m着色问题)

算法分析与设计实验报告

第 六 次附加实验

姓名

学号

班级

时间

12.26上午

地点

工训楼309

实验名称

回溯法实验(图的m着色问题)

实验目的

1. 掌握回溯法求解问题的思想

2. 学会利用其原理求解图的m着色问题

实验原理

问题描述:

给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。

基本解题步骤:

(1) 针对所给问题,定义问题的解空间;

(2) 确定易于搜索的解空间结构;

(3) 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

实验步骤

(1)首先将给定的图利用抽象图表示出来;

(2)判断该节点k当前的着色是否符合条件,需要判断x[k]与k节点其他相邻节点h的x[h]是否相等;

(3)回溯过程,如果此时的节点值已经大于节点总数,代表已经着色完成,并且找到了一种可行解,此时可以将可行解数+1;

(4)回溯从最后一个节点往上回溯,并一层一层更改节点至其他可用着色,以此来找到所有的填色方案。

关键代码

void Color::Backtrack(int t)

{

if(t>n) //到达叶子节点

{

sum++; //可行解+1

cout<

using namespace std;

class Color

{

friend void mColoring(int,int,int **);

private:

bool ok(int k);

void Backtrack(int t);

int n, //图的顶点个数

m, //可用颜色数

**a, //图的邻接矩阵

*x; //当前解

long sum; //当前已找到的可m着色的方案数

};

bool Color::ok(int k) //检查颜色可用性

{

for(int j=1;j<=n;j++)

if((a[k][j]==1)&&(x[j]==x[k])) //两个点之间有约束且颜色相同

return false;

return true;

}

void Color::Backtrack(int t)

{

if(t>n) //到达叶子节点

{

sum++; //可行解+1

cout<>n;

cout<>m;

int **a=new int*[n+1];

for(int i=0;i<=n;i++)

a[i]=new int[n+1];

for(int i=0;i<=n;i++) //利用抽象图实现图的邻接矩阵

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

a[i][j]=0;

int edge;

cout<>edge;

int v,w;

cout<>v>>w; //由于是无向图,所以对应的邻接矩阵对应的边都有,即v->m,m->v都有边

a[v][w]=1;

a[w][v]=1;

}

mColoring(n,m,a);

system("pause");

return 0;

}

展开阅读全文

你可能感兴趣的:(图的m可着色优化回溯法c语言)