【概述】
图着色问题(Graph Coloring Problem, GCP),是最著名的 NP-完全问题之一。
图的 m-着色问题是指:给定无向连通图 G 与 m 种不同的颜色,找出所有不同的着色法个数,使得任意相邻的 2 个顶点有着不同颜色
图的 m-着色判定问题是指:给定无向连通图 G 与 m 种不同的颜色,用这些颜色为图 G 的各顶点着色,问是否存在一种着色法使得 G 中任意相邻顶点着不同颜色
图的 m-着色优化问题是指:若一个图最少需要 m 种颜色才能使图中任意相邻的 2 个顶点着不同颜色,则称这个数 m 为该图的色数,求一个图的最小色数 m
【问题分析】
1.m-着色问题
对于 m-着色问题,其与八皇后、求子集和等问题有着相似之处,都是利用 dfs 来回溯搜索,其核心都是通过遍历找到所有的问题的子集。
int m,n,k;
int G[N][N];
int color[N];
int res;
void dfs(int x) {
if(x == n+1) {
res++;
return;
}
else {
for(int i=1; i<=k; i++) {
bool flag=false;
for(int y=1; y<=x; y++) {
if(G[x][y]==1 && color[y]==i) {
flag=true;
break;
}
}
if(flag==true)
continue;
color[x]=i;
dfs(x+1);
color[x]=0;
}
}
}
int main() {
scanf("%d%d%d",&n,&m,&k);//n个点m条边k种颜色
for(int i=1; i<=m; i++) {
int x,y;
scanf("%d%d",&x,&y);
G[x][y] = 1;
G[y][x] = 1;
}
dfs(1);
printf("%d",res);
return 0;
}
2.m-着色判定问题
m-着色判定问题是求一种染色方案数,最常见的应用是二分图的判定,即 2-着色判定问题
关于二分图的判定:点击这里
3.m-着色优化问题
关于 m-着色判定问题,存在一个猜想,即四色定理
其内容为:“任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。”
简单来说,对于一个图,最少需要 4 种颜色就能使得图中任意相邻的两个顶点着不同颜色