请大家给个主函数吧。谢谢了!
该问题是图的m着色问题。该程序目的是给定一个无向连通图G=(V,E)和m种不同的颜色。如果这个图不是m可着色的就给出否定回答,如果这个图是m可着色图的,则要找出所有不同的着色法。请各位给一个主函数和Backtrack()类。最好有比较详细的注视,谢谢了
递规函数Backtrack(1)实现对整个解空间的回溯搜索。Backtrack(i)搜索解空间中第i层子树。函数Backtrack是类Color的成员。类Color的其他成员记录解空间中结点信息,以减少传给函数Backtrack的参数。sum记录当前已找到的可m着色方案数。函数mColoring负责类Color的私有变量的初始化。
在函数Backtrack中,当i>n时,表示算法已搜索至一个叶结点,得到一个新的m着色方案,因此当前已找到的可m着色方案数sum++。
当i<=n时,当前扩展结点z是解空间中的一个内部结点。该结点有x[i]=1,2,3,,,,,,m 共m个儿子结点。对当前扩展结点z的每一个儿子结点,由函数Ok检查其可行性,并以深度优先的方式递归地对可行子树进行搜索,或减去不可行子树。
class Color
{
friend int 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++;
for(int i=1;i<=n;i++)
cout<<x[i]<<'';
cout<<endl;
}
else
for(int i=1;i<=m;i++)
{
x[t]=i;
if(Ok(t)) Backtrack(t+1);
}
}
//**********************************************************
int mColoring(int n,int m,int **a)
{
Color X;
//初始化X
X.n=n;
X.m=m;
X.a=a;
X.sum=0;
int *p=new int [n+1]; // what is the meaning ???
for(int i=0;i<=n;i++)
p[i]=0;
X.x=p;
X.Backtrack(1);
delet[] p;
return x.sum;
}
问题点数:0、回复次数:0Top




