算法分析与设计实验报告
第 六 次附加实验
姓名
学号
班级
时间
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;
}
展开阅读全文