(转自:http://blog.csdn.net/lican19911221/article/details/26264471

图的m着色问题的Java实现(回溯法)

具体问题描述以及C/C++实现参见网址

http://blog.csdn.NET/lican19911221/article/details/26228345

/**
* 着色问题
* @author Lican
*
*/
public class Coloring {
int n;//图的顶点数
int m;//可用颜色数
int[][] a;//图的邻接矩阵
int[] x;//当前解
long sum;//当前已找到的可m着色方案数
public long mcoloring(int mm,int nn,int[][] aa){
n=nn;
a=aa;
x=new int[n+];
m=mm;
sum=;
backtrack();
return sum;
}
public void backtrack(int t){
if(t>n){
sum++;
for(int i=;i<=n;i++)
System.out.print(x[i]+" ");
System.out.println();
}else{
for(int i=;i<=m;i++){
x[t]=i;
if(ok(t))//剪枝函数
backtrack(t+);
x[t]=;
}
}
}
public boolean ok(int k){
for(int j=;j<=n;j++){
if(a[k][j]==&&x[j]==x[k])//某条边的两个顶点着不同颜色;a[k][j]=1表示某条边(即边集E中的边)
return false;
}
return true;
}
public static void main(String[] args) {
//int n=5;
//int m=3;
//int[][] a={{-1,-1,-1,-1,-1,-1},{-1,0,1,1,1,0},{-1,1,0,1,1,1},{-1,1,1,0,1,0},{-1,0,1,1,0,1},{-1,0,1,0,1,0}};
//int n=4;
//int m=4;
//int[][] a={{-1,-1,-1,-1,-1},{-1,0,1,1,0},{-1,1,0,1,1},{-1,1,1,0,1},{-1,0,1,1,0}}; int n=;
int m=;
int[][] a={{-,-,-,-,-,-},{-,,,,,},{-,,,,,},{-,,,,,},{-,,,,,},{-,,,,,}};
Coloring c=new Coloring();
System.out.println("着色方案如下:");
long sum=c.mcoloring(m, n, a);
System.out.println("可行的着色方案数目为:"+sum);
}
}
/*
测试数据:
int n=4;
int m=4;
int[][] a={{-1,-1,-1,-1,-1},{-1,0,1,1,0},{-1,1,0,1,1},{-1,1,1,0,1},{-1,0,1,1,0}}; 输出: 着色方案如下:
1 2 3 1
1 2 3 4
1 2 4 1
1 2 4 3
1 3 2 1
1 3 2 4
1 3 4 1
1 3 4 2
1 4 2 1
1 4 2 3
1 4 3 1
1 4 3 2
2 1 3 2
2 1 3 4
2 1 4 2
2 1 4 3
2 3 1 2
2 3 1 4
2 3 4 1
2 3 4 2
2 4 1 2
2 4 1 3
2 4 3 1
2 4 3 2
3 1 2 3
3 1 2 4
3 1 4 2
3 1 4 3
3 2 1 3
3 2 1 4
3 2 4 1
3 2 4 3
3 4 1 2
3 4 1 3
3 4 2 1
3 4 2 3
4 1 2 3
4 1 2 4
4 1 3 2
4 1 3 4
4 2 1 3
4 2 1 4
4 2 3 1
4 2 3 4
4 3 1 2
4 3 1 4
4 3 2 1
4 3 2 4
可行的着色方案数目为:48 =======================================================
测试数据
int n=5;
int m=3;
int[][] a={{-1,-1,-1,-1,-1,-1},{-1,0,1,1,1,0},{-1,1,0,1,1,1},{-1,1,1,0,1,0},{-1,0,1,1,0,1},{-1,0,1,0,1,0}}; 输出:
着色方案如下:
1 2 3 1 3
1 3 2 1 2
2 1 3 2 3
2 3 1 2 1
3 1 2 3 2
3 2 1 3 1
可行的着色方案数目为:6
================================================================= 测试数据
int n=5;
int m=5;
int[][] a={{-1,-1,-1,-1,-1,-1},{-1,0,1,1,1,0},{-1,1,0,1,1,1},{-1,1,1,0,1,0},{-1,1,1,1,0,1},{-1,0,1,0,1,0}}; 输出:
着色方案如下:
1 2 3 4 1
1 2 3 4 3
1 2 3 4 5
1 2 3 5 1
1 2 3 5 3
1 2 3 5 4
1 2 4 3 1
1 2 4 3 4
1 2 4 3 5
1 2 4 5 1
1 2 4 5 3
1 2 4 5 4
1 2 5 3 1
1 2 5 3 4
1 2 5 3 5
1 2 5 4 1
1 2 5 4 3
1 2 5 4 5
1 3 2 4 1
1 3 2 4 2
1 3 2 4 5
1 3 2 5 1
1 3 2 5 2
1 3 2 5 4
1 3 4 2 1
1 3 4 2 4
1 3 4 2 5
1 3 4 5 1
1 3 4 5 2
1 3 4 5 4
1 3 5 2 1
1 3 5 2 4
1 3 5 2 5
1 3 5 4 1
1 3 5 4 2
1 3 5 4 5
1 4 2 3 1
1 4 2 3 2
1 4 2 3 5
1 4 2 5 1
1 4 2 5 2
1 4 2 5 3
1 4 3 2 1
1 4 3 2 3
1 4 3 2 5
1 4 3 5 1
1 4 3 5 2
1 4 3 5 3
1 4 5 2 1
1 4 5 2 3
1 4 5 2 5
1 4 5 3 1
1 4 5 3 2
1 4 5 3 5
1 5 2 3 1
1 5 2 3 2
1 5 2 3 4
1 5 2 4 1
1 5 2 4 2
1 5 2 4 3
1 5 3 2 1
1 5 3 2 3
1 5 3 2 4
1 5 3 4 1
1 5 3 4 2
1 5 3 4 3
1 5 4 2 1
1 5 4 2 3
1 5 4 2 4
1 5 4 3 1
1 5 4 3 2
1 5 4 3 4
2 1 3 4 2
2 1 3 4 3
2 1 3 4 5
2 1 3 5 2
2 1 3 5 3
2 1 3 5 4
2 1 4 3 2
2 1 4 3 4
2 1 4 3 5
2 1 4 5 2
2 1 4 5 3
2 1 4 5 4
2 1 5 3 2
2 1 5 3 4
2 1 5 3 5
2 1 5 4 2
2 1 5 4 3
2 1 5 4 5
2 3 1 4 1
2 3 1 4 2
2 3 1 4 5
2 3 1 5 1
2 3 1 5 2
2 3 1 5 4
2 3 4 1 2
2 3 4 1 4
2 3 4 1 5
2 3 4 5 1
2 3 4 5 2
2 3 4 5 4
2 3 5 1 2
2 3 5 1 4
2 3 5 1 5
2 3 5 4 1
2 3 5 4 2
2 3 5 4 5
2 4 1 3 1
2 4 1 3 2
2 4 1 3 5
2 4 1 5 1
2 4 1 5 2
2 4 1 5 3
2 4 3 1 2
2 4 3 1 3
2 4 3 1 5
2 4 3 5 1
2 4 3 5 2
2 4 3 5 3
2 4 5 1 2
2 4 5 1 3
2 4 5 1 5
2 4 5 3 1
2 4 5 3 2
2 4 5 3 5
2 5 1 3 1
2 5 1 3 2
2 5 1 3 4
2 5 1 4 1
2 5 1 4 2
2 5 1 4 3
2 5 3 1 2
2 5 3 1 3
2 5 3 1 4
2 5 3 4 1
2 5 3 4 2
2 5 3 4 3
2 5 4 1 2
2 5 4 1 3
2 5 4 1 4
2 5 4 3 1
2 5 4 3 2
2 5 4 3 4
3 1 2 4 2
3 1 2 4 3
3 1 2 4 5
3 1 2 5 2
3 1 2 5 3
3 1 2 5 4
3 1 4 2 3
3 1 4 2 4
3 1 4 2 5
3 1 4 5 2
3 1 4 5 3
3 1 4 5 4
3 1 5 2 3
3 1 5 2 4
3 1 5 2 5
3 1 5 4 2
3 1 5 4 3
3 1 5 4 5
3 2 1 4 1
3 2 1 4 3
3 2 1 4 5
3 2 1 5 1
3 2 1 5 3
3 2 1 5 4
3 2 4 1 3
3 2 4 1 4
3 2 4 1 5
3 2 4 5 1
3 2 4 5 3
3 2 4 5 4
3 2 5 1 3
3 2 5 1 4
3 2 5 1 5
3 2 5 4 1
3 2 5 4 3
3 2 5 4 5
3 4 1 2 1
3 4 1 2 3
3 4 1 2 5
3 4 1 5 1
3 4 1 5 2
3 4 1 5 3
3 4 2 1 2
3 4 2 1 3
3 4 2 1 5
3 4 2 5 1
3 4 2 5 2
3 4 2 5 3
3 4 5 1 2
3 4 5 1 3
3 4 5 1 5
3 4 5 2 1
3 4 5 2 3
3 4 5 2 5
3 5 1 2 1
3 5 1 2 3
3 5 1 2 4
3 5 1 4 1
3 5 1 4 2
3 5 1 4 3
3 5 2 1 2
3 5 2 1 3
3 5 2 1 4
3 5 2 4 1
3 5 2 4 2
3 5 2 4 3
3 5 4 1 2
3 5 4 1 3
3 5 4 1 4
3 5 4 2 1
3 5 4 2 3
3 5 4 2 4
4 1 2 3 2
4 1 2 3 4
4 1 2 3 5
4 1 2 5 2
4 1 2 5 3
4 1 2 5 4
4 1 3 2 3
4 1 3 2 4
4 1 3 2 5
4 1 3 5 2
4 1 3 5 3
4 1 3 5 4
4 1 5 2 3
4 1 5 2 4
4 1 5 2 5
4 1 5 3 2
4 1 5 3 4
4 1 5 3 5
4 2 1 3 1
4 2 1 3 4
4 2 1 3 5
4 2 1 5 1
4 2 1 5 3
4 2 1 5 4
4 2 3 1 3
4 2 3 1 4
4 2 3 1 5
4 2 3 5 1
4 2 3 5 3
4 2 3 5 4
4 2 5 1 3
4 2 5 1 4
4 2 5 1 5
4 2 5 3 1
4 2 5 3 4
4 2 5 3 5
4 3 1 2 1
4 3 1 2 4
4 3 1 2 5
4 3 1 5 1
4 3 1 5 2
4 3 1 5 4
4 3 2 1 2
4 3 2 1 4
4 3 2 1 5
4 3 2 5 1
4 3 2 5 2
4 3 2 5 4
4 3 5 1 2
4 3 5 1 4
4 3 5 1 5
4 3 5 2 1
4 3 5 2 4
4 3 5 2 5
4 5 1 2 1
4 5 1 2 3
4 5 1 2 4
4 5 1 3 1
4 5 1 3 2
4 5 1 3 4
4 5 2 1 2
4 5 2 1 3
4 5 2 1 4
4 5 2 3 1
4 5 2 3 2
4 5 2 3 4
4 5 3 1 2
4 5 3 1 3
4 5 3 1 4
4 5 3 2 1
4 5 3 2 3
4 5 3 2 4
5 1 2 3 2
5 1 2 3 4
5 1 2 3 5
5 1 2 4 2
5 1 2 4 3
5 1 2 4 5
5 1 3 2 3
5 1 3 2 4
5 1 3 2 5
5 1 3 4 2
5 1 3 4 3
5 1 3 4 5
5 1 4 2 3
5 1 4 2 4
5 1 4 2 5
5 1 4 3 2
5 1 4 3 4
5 1 4 3 5
5 2 1 3 1
5 2 1 3 4
5 2 1 3 5
5 2 1 4 1
5 2 1 4 3
5 2 1 4 5
5 2 3 1 3
5 2 3 1 4
5 2 3 1 5
5 2 3 4 1
5 2 3 4 3
5 2 3 4 5
5 2 4 1 3
5 2 4 1 4
5 2 4 1 5
5 2 4 3 1
5 2 4 3 4
5 2 4 3 5
5 3 1 2 1
5 3 1 2 4
5 3 1 2 5
5 3 1 4 1
5 3 1 4 2
5 3 1 4 5
5 3 2 1 2
5 3 2 1 4
5 3 2 1 5
5 3 2 4 1
5 3 2 4 2
5 3 2 4 5
5 3 4 1 2
5 3 4 1 4
5 3 4 1 5
5 3 4 2 1
5 3 4 2 4
5 3 4 2 5
5 4 1 2 1
5 4 1 2 3
5 4 1 2 5
5 4 1 3 1
5 4 1 3 2
5 4 1 3 5
5 4 2 1 2
5 4 2 1 3
5 4 2 1 5
5 4 2 3 1
5 4 2 3 2
5 4 2 3 5
5 4 3 1 2
5 4 3 1 3
5 4 3 1 5
5 4 3 2 1
5 4 3 2 3
5 4 3 2 5
可行的着色方案数目为:360 */

最新文章

  1. 《HiWind企业快速开发框架实战》(3)使用HiWind创建和管理菜单
  2. 地图、定位 CLLocationManager CLGeocoder CLPlacemark
  3. 【QT】C++ GUI Qt4 学习笔记5
  4. 【SVN】自动备份SVN仓库
  5. UploadifyAPI-上传插件属性和方法介绍
  6. linux下用非root用户重启导致ssh无法连接的问题
  7. 17、手势(Gesture)
  8. 【译】 AWK教程指南 10编写可与用户交互的AWK程序
  9. transition和animation动画简介
  10. Cocos发育Visual Studio下一个HttpClient开发环境设置
  11. Divisors poj2992
  12. 使用webgl(three.js)搭建一个3D建筑,3D消防模拟——第三课
  13. 如何获得mysql数据库的所有的列
  14. python --- 22 初始模块 random time collections functools
  15. Redis简介与Memcached的比较
  16. js中push()的用法
  17. Ubuntu 最好用的CHM阅读器KchmViewer
  18. JS弹出div简单样式
  19. PowerDesigner如何将消失的工具栏显示出来
  20. intellij 插件结构(文件结构以及概念层面上的结构)

热门文章

  1. Python—发邮件总结
  2. Unix高级环境编程—进程控制(一)
  3. 【BZOJ4908】[BeiJing2017]开车 分块
  4. 基于传统IPC基础上的RTMP互联网推流摄像机方案设计
  5. 【题解】HNOI2013比赛
  6. RDS for MySQL 删除数据后空间没有减少处理方法
  7. 在linux 中卸载Mysql
  8. 小程序开发之xxx is not defined
  9. POJ - 1426 Find The Multiple 【DFS】
  10. matplotlib和numpy 学习笔记