算法 图的M着色问题

题目

给定无向连通图和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的两个顶点有不同的颜色。这个问题是图的m可着色判定问题。
若一个图最少需要m种颜色才能使图中每条边相连接的两个顶点着不同颜色,称这个数m为这个图的色数。
求一个图的色数m称为图的m可着色优化问题。给定一个图以及m种颜色,请计算出涂色方案数。

算法 图的M着色问题_第1张图片


分析

回溯法。涂的时候从颜色1开始到m,每当涂上一个色,判断这个点是否可以涂这个色,不可以的话就不再往下涂了,换成另一个颜色,可以的话就继续。


#include     
#include 
#define n 5
#define m 4 //颜色数

int a[n+1][n+1]={
    {0,0,0,0,0,0},  
    {0,0,1,1,1,0},  
    {0,1,0,1,1,1},  
    {0,1,1,0,1,0},  
    {0,1,1,1,0,1},  
    {0,0,1,0,1,0}
};   
int count=0;//方案数
int color[n+1]={0};//涂颜色数组

bool ok(int x){
    for(int i=1; i<=n; i++){
        if(a[x][i]==1 && color[x]==color[i]){//不能为1,不重复
            return false;
        }
    }
    return true;
}

void dfs(int t){
    if(t>n){//有n个顶点的图的着色树是有n+1层
        count++;
    }else{
        for(int i=1; i<=m; i++){//涂个色 1~m
            color[t]=i;
            if(ok(t)){
                dfs(t+1);
            }
            color[t]=0;
        }
    }
}

int main(){  
    dfs(1);//从1开始
    printf("%d\n",count);
    return 0;    
}    

你可能感兴趣的:(Algorithm)