图的m着色问题-回溯法

排列树问题

图的m着色问题-回溯法_第1张图片

给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色?

输出结果:

图的m着色问题-回溯法_第2张图片

#include 

using namespace std;

const int N=5;   //
const int M=3;

//5.8节图的m着色问题(回溯法)


/*
0 1 1 1 0
1 0 1 1 1
1 1 0 1 0
0 1 1 0 1
0 1 0 1 0

              顶点N=5的图邻接矩阵如上。。。
*/

class Color{
     friend int mColoring(int ,int ,int **);
     private:
              bool Ok(int k);             //用于判断某一顶点染色x[k]能否为某一值 i ;
              void Backtrack(int t);

              int n,        //图的顶点数
                  m,        //可用颜色数
                  **a,      //图的邻接矩阵
                  *x;      //当前解
              long  sum;    // 当m为某一确定值时,当前找到的m着色方案数
};


bool Color::Ok(int k){      //检测当前顶点染色x[k]为值 i 能否满足

              for(int j=1;j<=n;j++){
                            if( (a[k][j]==1) &&(x[j]==x[k])  )//相邻且颜色相同,则
                            return false;                     //返回false
              }
              return true;

}


void Color::Backtrack(int t){
              if(t>n){
                            sum++;
                              cout<<"顶点N="<>a[i][j];
                    }
     }


         int ans=mColoring(N,M,a);
     cout<<"用M="<


你可能感兴趣的:(算法)