图的m着色问题

图的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 相邻。然后进行着颜色,
    每次上色之后都要判断 该顶点与该顶点相连的顶点的颜色是否冲突,若冲突,则重新选择颜色填入,
    否则就 添加下一个点的颜色。
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章