图的m着色问题

来源:互联网 发布:android ui 设计软件 编辑:程序博客网 时间:2024/05/18 01:27

图的m着色问题

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

#include<stdio.h>int m,n;int count=0;int color[100]={0};int c[100][100];bool ok(int k)  //判断顶点k的着色是否发生冲突{    int i;    for(i=1;i<k;i++)        if(c[k][i]==1 && color[i]==color[k])            return false;        return true;}void backtrack(int t){    int i,j;    if(t>n)//求解完毕,输出解    {        for(i=1;i<=n;i++)            printf(" %d ",color[i]);        count++;        printf("\n\n");    }    else    {        for(j=1;j<=m;j++) //搜索m叉树,每一个结点都有m中颜色可选        {            color[t]=j;     //为第i个结点着色            if(ok(t))   //检查当前结点所着颜色没有与前面的顶点冲突                backtrack(t+1);     //为下一个顶点着色            color[t]=0;        }    }}int main(){    int i,j;    printf("输入顶点数n和着色数m:\n");    scanf("%d %d",&n,&m);    printf("输入无向图的邻接矩阵:\n");    for(i=1;i<=n;i++)        for(j=1;j<=n;j++)            scanf("%d",&c[i][j]);    printf("着色所有可能的解:\n");    backtrack(1);    printf("共有%d种解。\n",count);    return 0;}/*思路:    首先建立该图的邻接矩阵,矩阵中,(x,y)值为 1 代表 x , y 相邻。然后进行着颜色,    每次上色之后都要判断 该顶点与该顶点相连的顶点的颜色是否冲突,若冲突,则重新选择颜色填入,    否则就 添加下一个点的颜色。*/