(转自: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 */

算法java实现--回溯法--图的m着色问题的更多相关文章

  1. 回溯法 | 图的m着色问题

    学习链接:算法 图的M着色问题 虽然今早9点才醒来,10点才来教室,但是coding得很高效.吃个早餐,拉个粑粑的时间,就把算法书上的[图的m着色]问题看明白了,大脑里也形成了解决问题的框架. 其实这 ...

  2. 【回溯】图的m着色问题

    问题 C: [回溯]图的m着色问题 时间限制: 1 Sec  内存限制: 128 MB提交: 1  解决: 1[提交][状态][讨论版] 题目描述 给定无向连通图G=(V, E)和m种不同的颜色,用这 ...

  3. 五大常用算法之四:回溯法[zz]

    http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html 1.概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试 ...

  4. noj算法 素数环 回溯法

    描述: 把1到20这重新排列,使得排列后的序列A满足:a. 任意相邻两个数之和是素数b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的 ...

  5. noj算法 堡垒问题 回溯法

    描述: 城堡是一个4×4的方格,为了保卫城堡,现需要在某些格子里修建一些堡垒.城堡中的某些格子是墙,其余格子都是空格,堡垒只能建在空格里,每个堡垒都可以向上下左右四个方向射击,如果两个堡垒在同一行或同 ...

  6. noj算法 迷宫问题 回溯法

    描述: 给一个20×20的迷宫.起点坐标和终点坐标,问从起点是否能到达终点. 输入: 多个测例.输入的第一行是一个整数n,表示测例的个数.接下来是n个测例,每个测例占21行,第一行四个整数x1,y1, ...

  7. noj算法 踩气球 回溯法

    描述: 六一儿童节,小朋友们做踩气球游戏,气球的编号是1-100,两位小朋友各踩了一些气球,要求他们报出自己所踩气球的编号的乘积.现在需要你编一个程序来判断他们的胜负,判断的规则是这样的:如果两人都说 ...

  8. noj算法 装载问题 回溯法

    描述: 有两艘船,载重量分别是c1. c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2.确定是否有可能将所有集装箱全部装入两艘船. 输入: 多个测例,每个测例的输入占 ...

  9. 回溯法最优装载问题(java)

    1.问题描述:      有一批共有 n 个集装箱要装上两艘载重量分别为 c1 和 c2 的轮船,其中集装箱 i 的重量为 w[i], 且重量之和小于(c1 + c2).装载问题要求确定是否存在一个合 ...

随机推荐

  1. python 基础 1.6 python 帮助信息及数据类型间相互转换

      一. 帮助信息   # dir() 方法  查看函数的方法   # help()   # type() 查看类型   name = raw_input('please input you name ...

  2. 九度OJ 1061:成绩排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:17158 解决:4798 题目描述: 有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相 ...

  3. WePY根据环境变量来改变运行时的参数

    WePY根据环境变量来改变运行时的参数 · Tencent/wepy Wiki https://github.com/Tencent/wepy/wiki/WePY%E6%A0%B9%E6%8D%AE% ...

  4. Pentaho BIServer Community Edtion 6.1 使用教程 第三篇 发布和调度Kettle(Data Integration) 脚本 Job & Trans

    Pentaho BIServer Community Edtion 6.1 集成了 Kettle 组件,可以运行Kettle 程序脚本.但由于Kettle没有直接发布到 BIServer-ce 服务的 ...

  5. (转)CentOS 5.5 64bit 编译安装Adobe FlashMediaServer 3.5

    http://download.macromedia.com/pub/flashmediaserver/updates/4_0_2/Linux_32bit/FlashMediaServer4.tar. ...

  6. log4j 2 入门实例(2)

    本文介绍将日志输出到文件的例子. log4j 2输出到文件 log4j2.xml文件 这个文件里,定义了三个类型的Appender:Console.File和RollingFile. Console类 ...

  7. MySQL修改配置 区分大小写

    在使用mysql的时候,数据库名,表名,字段名等有大小写的区分,这个可以通过配置文件设置.如果设置了严格区分大小写,在访问表的时候没有注意到表名的大小写,将会报出表不存在的错误.下面是修改配置文件: ...

  8. Machine Learning No.10: Anomaly detection

    1. Algorithm 2. evaluating an anomaly detection system 3. anomaly detection vs supervised learning 4 ...

  9. spring-boot5代码

    App.java package com.kfit.spring_boot_mybatis; import org.mybatis.spring.annotation.MapperScan; impo ...

  10. 复制一个带random指针的链表

    一个单链表,其中除了next指针外,还有一个random指针,指向链表中的任意某个元素.如何复制这样一个链表呢? 通过next来复制一条链是很容易的,问题的难点在于如何恰当地设置新链表中的random ...