64,682
社区成员
发帖
与我相关
我的任务
分享
/**********************************************************
5-8 m图着色问题
2011年5月7日9:05:30
记录:
************************************************************/
#include<iostream>
using namespace std ;
class Color
{
private :
int n , //图的顶点数
**a , //图的邻接矩阵
m , //可用着色数
*x ; //当前解
long Sum ; //已找到的可行方案
bool Available (int t) ; //检查颜色的可用性
void Backtrack (int t) ; //m图着色问题核心算法
public :
Color () //默认的构造函数
{
n = m = Sum = 0 ;
}
Color (int n, int m) //带形参的构造函数
{
int i(0), j(0) ;
this ->n = n ;
this ->m = m ;
Sum = 0 ;
x = new int[n+1] ;
a = new int*[n+1] ;
for (i = 1 ; i <= n ; ++i)
a[i] = new int[n+1] ;
for (i = 1 ; i <= n ; ++i)
x[i] = 0 ;
cout <<"请依次输入该图的边的信息......"<<endl ;
for (i = 1 ; i <= n ; ++i)
for (j = 1 ; j <= n ; ++j)
cin >>a[i][j] ;
}
~Color () //析构函数
{
int i(0) ;
delete []x ;
for (i = 1 ; i <= n ; ++i)
delete []a[i] ;
delete []a ;
}
friend int mColoring (int n, int m) ;
} ;
int mColoring (int n, int m) ;
int main()
{
cout <<"请分别输入图的顶点数和颜色种数:" ;
int n(0), m(0) ;
cin >>n >>m ;
int Sum = mColoring (n, m) ;
cout <<"该m着色问题的方案有"<<Sum <<"种!"<<endl ;
return 0 ;
}
int mColoring (int n, int m)
{
Color X(n, m) ;
X.Backtrack (1) ;
return X.Sum ;
}
//m图着色问题核心算法
void Color::Backtrack (int t)
{
if (t > n)
{
int i(0) ;
++Sum ;
for (i = 1 ; i <= n ; ++i)
cout <<x[i] <<' ' ;
cout <<endl ;
}
else
{
int i(0) ;
for (i = 1 ; i <= m ; ++i)
{
x[t] = i ;
if ( Available(t) )
{
Backtrack (t+1) ;
}
x[t] = 0 ;
}
}
}
bool Color::Available (int t)
{
int i (0) ;
for (i = 1 ; i <= n ; ++i)
if ( (a[t][i] == 1) && (x[t] == x[i]) )
return false ;
return true ;
}