图的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 相邻。然后进行着颜色,
每次上色之后都要判断 该顶点与该顶点相连的顶点的颜色是否冲突,若冲突,则重新选择颜色填入,
否则就 添加下一个点的颜色。
*/