(转自: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. 【BZOJ1222】[HNOI2001]产品加工 DP

    [BZOJ1222][HNOI2001]产品加工 Description 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同 ...

  2. SAM4E单片机之旅——13、LCD之ASF初步

    在Atmel Studio 6中,集成了Atmel Software Framework(ASF框架).通过它提供的库,可以很快速地完成新的项目. 这次的最终目标使用ASF在LCD上显示出文字“Hel ...

  3. 各种RTMP直播流播放权限_音视频_数据花屏_问题检测与分析工具EasyRTMPClient

    之前的一篇博客<网络摄像机IPCamera RTSP直播播放网络/权限/音视频数据/花屏问题检测与分析助手EasyRTSPClient>,我们介绍了RTSP流的检测和分析工具EasyRTS ...

  4. Louvain Modularity Fast unfolding of communities in large networks

    Louvain Modularity Fast unfolding of communities in large networks https://arxiv.org/pdf/0803.0476.p ...

  5. Linux搭建FTP服务器实战

    首先准备一台Linux系统机器(虚拟机也可), 检测出是否安装了vsftpd软件: rpm -qa |grep vsftpd 如果没有输出结果,就是没有安装. 使用命令安装,安装过程中会有提示,直接输 ...

  6. 基于GeoEvent Processor的物联网应用案例赏析

    1 技术路线 下面全部应用,都採用ArcGIS for Server,结合GeoEvent产品(为一款物联网实时数据集成处理产品)开发完毕. 2 应用场景 1.1   物联网实时态势感知 1.1.1 ...

  7. CodeForces - 799B T-shirt buying 【贪心】

    题目链接 http://codeforces.com/problemset/problem/799/B 题意 给出N件衣服 pi 表示 第i件衣服的价格 ai 表示 第i件衣服的前面的颜色 bi 表示 ...

  8. 线性结构2 一元多项式的乘法与加法运算 【STL】

    02-线性结构2 一元多项式的乘法与加法运算(20 分) 设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和 ...

  9. 使用 eslint 和 editorconfig 规范代码

    项目中使用eslint 为什么使用eslint : 为了保持代码风格的统一 在做vue项目的时候, 基本上都会使用 vue-cli 脚手架去创建一个vue 项目,里面可以选择使用eslint 代码检测 ...

  10. Contiki 2.7 Makefile 文件(五)

    4.第四部分 (1) oname = ${patsubst %.c,%.o,${patsubst %.S,%.o,$(1)}} 自定义函数,$(1)表示调用oname这个函数的第一个参数,patsub ...