染色问题的算法(转)

#include<iostream> 
#define NUM 5 
using namespace  std; 
 
bool ok(int i,int b[],int a[NUM][NUM]) 
{ 
for(int j=0;j<i;j++) 
  if(a[i][j]==1&&b[i]==b[j]) 
      return false; 
return true; 
} 
void backtrackcoloring(int i,int vertexnum,int &sum,int a[NUM][NUM]) 
{ 
    int n=vertexnum; 
    int *b=new int[n]; 
    if(i>n) 
        sum++; 
    else 
    { 
        for(int j=0;j<4;j++) 
        {    b[i]=j; 
           if(ok(i,b,a)) 
               backtrackcoloring(i+1,vertexnum,&sum,a); 
        } 
    } 
} 
int main() 
{ 
    int sum=0; 
    int m,n; 
    int a[NUM][NUM]; 
    int linenum=8; 
    int vertexnum=5; 
    for(int i=0;i<NUM;i++) 
        for(int j=0;j<NUM;j++) 
        { 
            a[i][j]=0; 
            a[j][i]=0; 
        } 
    for(i=0;i<8;i++) 
    {     
        cin>>m>>n; 
        a[m][n]=1; 
        a[n][m]=1; 
    } 
    backtrackcoloring(0,vertexnum,&sum,a); 
    cout<<sum<<endl; 
    return 0; 
}

 

枚举遍历法...还以为是基于dfs遍历的

ps:手机编辑,排版不好...

原文:http://m.blog.csdn.net/article/details?id=26163067

 

下面的这个与上面的思路一样,代码是非递规的,虽然代码比较锉,可以看看作为参考。

链接:http://m.blog.csdn.net/article/details?id=17641017

 

posted @ 2016-12-05 08:53  gongpixin  阅读(1252)  评论(0编辑  收藏  举报