m着色问题(回溯算法)
来源:互联网 发布:java 邮件认证 编辑:程序博客网 时间:2024/05/02 06:10
算法思想:将图形转换为无向连通图,若两点之间相邻,则判断颜色,颜色相同则退出,若能到达最后一个点,则说明有一种涂色方案,count便加1.
#include<stdio.h>#define m 4#define n 5int count =0;int mar[n][n] = {{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;}
阅读全文
0 0
- m着色问题(回溯算法)
- 回溯算法----图的M着色问题
- c++实现回溯算法解决图的M着色问题
- 算法java实现--回溯法--图的m着色问题
- NOJ(1575)-回溯算法-图的m着色问题
- 回溯法求解m着色问题
- 回溯经典-m图着色问题
- 图的m着色问题(回溯)
- 图的m着色问题-回溯法
- 0030算法笔记——【回溯法】最大团问题和图的m着色问题
- 图的m着色(回溯法)
- 022-3着色问题-回溯法-《算法设计技巧与分析》M.H.A学习笔记
- 图的m着色问题(回溯法-满m叉树)
- 回溯经典-m图着色问题(和地图4色问题的区别)
- 回溯--深度优先搜索(图的M着色问题 poj1129)
- 图的点着色、区间着色问题及其应用(基于贪心思想的DFS回溯法求点着色问题和区间着色算法求解任务调度问题)
- 算法 图的M着色问题
- 回溯算法---四色图着色
- Face++实战
- 值得收藏的网址
- debian安装ftp客户端
- HDUOJ 1297
- 使用xutils在线预览和压缩保存图片
- m着色问题(回溯算法)
- MATLAB实用函数及技巧整理
- 推荐一个Video转gif的网站
- 2012.B组.古堡算式(暴力)
- 图像类型间的转换-matlab
- windows远程桌面连接ubuntu:xrdp
- JAVA11.16作业
- 项目发布到服务器时为什么要将端口号改为80
- python 正态分布随机数 numpy.random.randn 使用小技