m着色问题(回溯算法)
2017-11-23 16:35
162 查看
算法思想:将图形转换为无向连通图,若两点之间相邻,则判断颜色,颜色相同则退出,若能到达最后一个点,则说明有一种涂色方案,count便加1.
#include<stdio.h> #define m 4 #define n 5 int count =0; int mar = {{0,1,1,1,0},{1,0,1,1,1},{1,1,0,1,0},{1,1,1,0,1},{0,1,0,1,0}};//0表示不相邻,1表示相邻 int color[m]; int judge(int t){ int i; for(i=0;i<t;i++){ if(mar[i][t]==1&&color[i]==color[t]) return 0; } return 1; } void traceback(int t){ int i; if(t==n){ count++; return ; } for(i=0;i<m;i++){ color[t] = i; if(judge(t)) traceback(t+1); } } int main(){ traceback(0); printf("%d",count); return 0; }百度百科上的算法较为规整,代码如下:
#include<stdio.h> int color[100]; bool ok(int k,int c[][100])//判断顶点k的着色是否发生冲突 { int i,j; for(i=1;i<k;i++) { if(c[k][i]==1&&color[i]==color[k]) return false; } return true; } void graphcolor(int n,int m,int c[][100]) { int i,k; for(i=1;i<=n;i++) color[i]=0; k=1; while(k>=1) { color[k]=color[k]+1; while(color[k]<=m) if(ok(k,c)) break; else color[k]=color[k]+1;//搜索下一个颜色 if(color[k]<=m&&k==n) { for(i=1;i<=n;i++) printf("%d",color[i]); printf("\n"); } else if(color[k]<=m&&k<n) k=k+1;//处理下一个顶点 else { color[k]=0; k=k-1;//回溯 } } } int main() { int i,j,n,m; int c[100][100];//存储n个顶点的无向图的数组 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"); graphcolor(n,m,c); return 0; }
相关文章推荐
- NOJ(1575)-回溯算法-图的m着色问题
- 回溯算法之N皇后问题
- 质数填表问题的回溯算法
- 着色问题的代码实现(java版)使用回溯法和贪心思想
- 编程之美:1.9高效率安排见面会 图的m着色问题 回溯法
- 质数填表问题的回溯算法
- 39级台阶问题(回溯算法)
- 国际象棋“皇后”问题的回溯算法
- 哈密尔顿回路(旅行售货员问题)的回溯算法
- 打印组合数问题之递归版回溯算法
- 回溯算法-八皇后问题
- C++实现 八皇后问题及其扩展N皇后问题(经典回溯算法)
- 图的m着色问题 (回溯搜索)
- 解决代码着色组件SyntaxHighlighter行号显示问题
- 最佳调度问题的回溯算法(java实现)
- OpenJudge 2.5-1700 八皇后问题【回溯算法】
- NPC问题——回溯算法、聚类分析
- 图的m着色问题(回溯法-满m叉树)
- 第一次实验作业(NPC问题----回溯算法,聚类分析)
- 算法 图的M着色问题