算法java实现--回溯法--图的m着色问题
(转自: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着色问题的更多相关文章
- 回溯法 | 图的m着色问题
学习链接:算法 图的M着色问题 虽然今早9点才醒来,10点才来教室,但是coding得很高效.吃个早餐,拉个粑粑的时间,就把算法书上的[图的m着色]问题看明白了,大脑里也形成了解决问题的框架. 其实这 ...
- 【回溯】图的m着色问题
问题 C: [回溯]图的m着色问题 时间限制: 1 Sec 内存限制: 128 MB提交: 1 解决: 1[提交][状态][讨论版] 题目描述 给定无向连通图G=(V, E)和m种不同的颜色,用这 ...
- 五大常用算法之四:回溯法[zz]
http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741376.html 1.概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试 ...
- noj算法 素数环 回溯法
描述: 把1到20这重新排列,使得排列后的序列A满足:a. 任意相邻两个数之和是素数b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的 ...
- noj算法 堡垒问题 回溯法
描述: 城堡是一个4×4的方格,为了保卫城堡,现需要在某些格子里修建一些堡垒.城堡中的某些格子是墙,其余格子都是空格,堡垒只能建在空格里,每个堡垒都可以向上下左右四个方向射击,如果两个堡垒在同一行或同 ...
- noj算法 迷宫问题 回溯法
描述: 给一个20×20的迷宫.起点坐标和终点坐标,问从起点是否能到达终点. 输入: 多个测例.输入的第一行是一个整数n,表示测例的个数.接下来是n个测例,每个测例占21行,第一行四个整数x1,y1, ...
- noj算法 踩气球 回溯法
描述: 六一儿童节,小朋友们做踩气球游戏,气球的编号是1-100,两位小朋友各踩了一些气球,要求他们报出自己所踩气球的编号的乘积.现在需要你编一个程序来判断他们的胜负,判断的规则是这样的:如果两人都说 ...
- noj算法 装载问题 回溯法
描述: 有两艘船,载重量分别是c1. c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2.确定是否有可能将所有集装箱全部装入两艘船. 输入: 多个测例,每个测例的输入占 ...
- 回溯法最优装载问题(java)
1.问题描述: 有一批共有 n 个集装箱要装上两艘载重量分别为 c1 和 c2 的轮船,其中集装箱 i 的重量为 w[i], 且重量之和小于(c1 + c2).装载问题要求确定是否存在一个合 ...
随机推荐
- python 基础 9.1 连接数据库
二.数据库连接 MySQLdb 提供了connect 方法用来和数据库建立连接,接收数个参数,返回连接对象: #/usr/bin/python #coding=utf-8 #@Time :2017 ...
- tp框架知识 之(链接数据库和操作数据内容)
框架有时会用到数据库的内容,在"ThinkPhp框架知识"的那篇随笔中提到过,现在这篇随笔详细的描述下. 一.链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编写con ...
- 利用python进行数据分析之pandas入门
转自https://zhuanlan.zhihu.com/p/26100976 目录: 5.1 pandas 的数据结构介绍5.1.1 Series5.1.2 DataFrame5.1.3索引对象5. ...
- EasyPlayerPro(Windows)流媒体播放器功能介绍及应用场景
EasyPLyerPro(Windows)经过为期一个月的开发已经基本完成,虽然目前仍存在一些小问题,但是总体功能还是趋于比较稳定和强大的,下面对其功能和应用场景做简要介绍. 一.EasyPlayer ...
- linux自动ftp上传与下载文件的简单脚本
#!/bin/sh cd /data/backup/55mysql DATE=`date +'%Y%m%d'`file="55_mysql_"$DATE"03*.rar& ...
- 关于eclipse 插件的挂载
学习java的时候,不喜欢myeclipse 这种插件,什么都准备好了,自己动手就少了,不利于自己学习,现在我就diy 自己选几个插件来用,基本上就是 eclipse 加上我自己要用的插件,插件的安装 ...
- 如果这种方式导致程序明显变慢或者引起其他问题,我们要重新思考来通过 goroutines 和 channels 来解决问题
https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/09.3.md 9.3 锁和 sync 包 在一些复杂的程序中,通常通 ...
- squid代理缓存服务器
参考文章 http://www.cnblogs.com/mchina/p/3812190.html ;
- 在非OnPaint里应该使用ClientDC来画图
import wx class Example(wx.Frame): def __init__(self, parent, title): super(Example, self).__init__( ...
- 算法(Algorithms)第4版 练习 1.3.9
主要思路: 用Dijkstra的双栈算法. 遇到数字则压入数字栈中(String). 遇到运算符则压入运算符栈中(String). 遇到右括号时,从数字栈和运算法栈中弹出相应的元素,生成相应的运算表达 ...