着色问题
Posted zhhhb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了着色问题相关的知识,希望对你有一定的参考价值。
描述
图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。
解析
(1)通过回溯的方法,不断的为每一个节点着色,在前面cur-1个节点都合法的着色之后,开始对第cur-1个节点进行着色,
(2)这时候枚举可用的m个颜色,通过和第cur-1个节点相邻的节点的颜色,来判断这个颜色是否合法
(3)如果找到那么一种颜色使得第cur-1个节点能够着色,那么说明m种颜色的方案在当前是可行的。
(4)cur每次迭代加1,如果cur增加到N并通过了检测,说明m种颜色是可满足的。
(5)注意,这里只是要求判断m种颜色是否可满足,所以找到任何一种方案就可以了。
代码
#include<bits/stdc++.h> using namespace std; int n,m; //n顶点数,m颜色数 int graph[20][20]; int color[20]; int iRet = 0; bool love(int zhb) { for(int hy = 1;hy<=n;hy++) { if(graph[hy][zhb] && color[zhb] == color[hy]) return true; } return false; } void backtrack(int cur) { if(cur > n) { for(int i=1;i<=n;i++) { printf("%d ",color[i]); } iRet++; printf(" "); } else { for(int i=1;i<=m;i++) { color[cur] = i; if(!love(cur)) { backtrack(cur+1); } color[cur] = 0; } } } int main() { int a,b; scanf("%d%d",&n,&m); while(scanf("%d%d",&a,&b) != EOF) { graph[a][b] = 1; graph[b][a] = 1; if(a == 0 && b == 0) break; } backtrack(1); printf("----------- "); printf("total:%d",iRet); return 0; }
以上是关于着色问题的主要内容,如果未能解决你的问题,请参考以下文章