问题描述:给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。
输入:无向图,m
输出:如果能,则输出方案
算法:
t=1
对当前的第t个顶点着色;
如果t>n,则已经求得一组解,输出方案并返回;
否则,依次对顶点t着色1--m;
若t与所有相邻的顶点无颜色冲突,则继续为下一个顶点着色;
否则,回溯,测试下一种颜色;
程序代码:
#include<stdio.h>
#include<string.h>
#define N 100
int map[N][N],color[N],n,m,count;//color数组用来记录n个顶点的着色情况
int ok(int cur) {
int i;
for(i=1;i<cur;i++)
if(map[cur][i]==1&&color[cur]==color[i]) return 0;
return 1;
}
void graphcolor(int cur) {
int i;
if(cur>n) {
for(i=1;i<=n;i++)
printf("%d ",color[i]);
printf("\n");
count++;
return;
}
for(i=1;i<=m;i++) {
color[cur]=i;
if(ok(cur)==1)
graphcolor(cur+1);
}
}
int main() {
int i,j,k,a,b;
scanf("%d %d %d",&n,&k,&m);
memset(map,0,sizeof(map));
for(i=1;i<=k;i++){//初始化地图
scanf("%d %d",&a,&b);
map[a][b]=map[b][a]=1;
}
count=0;
graphcolor(1);
printf("%d\n",count);
system("pause");
return 0;
}
/*
5 8 4
2 1
2 3
2 4
2 5
1 3
3 4
4 5
1 4
1 2 3 4 1
1 2 3 4 3
1 2 4 3 1
1 2 4 3 4
1 3 2 4 1
1 3 2 4 2
1 3 4 2 1
1 3 4 2 4
1 4 2 3 1
1 4 2 3 2
1 4 3 2 1
1 4 3 2 3
2 1 3 4 2
2 1 3 4 3
2 1 4 3 2
2 1 4 3 4
2 3 1 4 1
2 3 1 4 2
2 3 4 1 2
2 3 4 1 4
2 4 1 3 1
2 4 1 3 2
2 4 3 1 2
2 4 3 1 3
3 1 2 4 2
3 1 2 4 3
3 1 4 2 3
3 1 4 2 4
3 2 1 4 1
3 2 1 4 3
3 2 4 1 3
3 2 4 1 4
3 4 1 2 1
3 4 1 2 3
3 4 2 1 2
3 4 2 1 3
4 1 2 3 2
4 1 2 3 4
4 1 3 2 3
4 1 3 2 4
4 2 1 3 1
4 2 1 3 4
4 2 3 1 3
4 2 3 1 4
4 3 1 2 1
4 3 1 2 4
4 3 2 1 2
4 3 2 1 4
48
*/