TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
图的m-着色判定问题――给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色? 图的m-着色优化问题――若一个图最少需要m种颜色才能使图中任意相邻的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的最小色数m的问题称为m-着色优化问题。
算法描述(回逆算法)
color[n]存储n个顶点的着色方案,可以选择的颜色为1到m t=1,对当前第t个顶点开始着色: 若t>n 则已求得一个解,输出着色方案即可 否则,依次对顶点t着色1-m,若t与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;否则,回溯,测试下一颜色。

另一程序:- import javax.swing.JOptionPane;
- public class Coloring {
- static int n, //图的顶点数
- m; //可用颜色数
- static boolean[][] a = { //图的邻接矩阵
- {false,false,false,false,false,false},
- {false,false,true,true,true,false},
- {false,true,false,true,true,true},
- {false,true,true,false,true,false},
- {false,true,true,true,false,true},
- {false,false,true,false,true,false},
- };
- static int[] x; //当前解
- static long sum; //当前已找到的可m着色方案数
-
- public static void main(String[] args) throws Exception {
- n = a[0].length-1;
- try {
- m = Integer.parseInt(JOptionPane.showInputDialog(null, "请输入可用的颜色数,例如:3", "输入",
- JOptionPane.INFORMATION_MESSAGE));
- } catch(NumberFormatException e1) {
- JOptionPane.showMessageDialog(null, "数据格式不正确,请重新运行程序输入!", "提示",
- JOptionPane.WARNING_MESSAGE);
- return;
- }
- catch(Exception e) {
- JOptionPane.showMessageDialog(null, "程序运行过程中出现其他类型的异常!", "提示",
- JOptionPane.WARNING_MESSAGE);
- return;
- }
- x = new int[n+1];
- System.out.println("可行解方案数共为:" + mColoring(m)); //输出可行解方案数
- }
-
- public static long mColoring(int mm) {
- m = mm;
- sum = 0;
- backtrack(1);
- return sum;
- }
-
- private static void backtrack(int t) {
- if(t > n) { //搜索到叶结点
- sum++;
- for(int i=1; i<=n; i++)
- System.out.print(x[i] + " ");
- System.out.print("
- ");
- }
- else
- for(int i=1; i<=m; i++) {
- x[t] = i;
- if(ok(t)) backtrack(t+1);
- x[t] = 0;
- }
- }
-
- private static boolean ok(int k) { //检查颜色可用性
- for(int j=1; j<=n; j++)
- if(a[k][j] && (x[j]==x[k])) return false;
- return true;
- }
- }
-
复制代码
源码下载:http://file.javaxxz.com/2014/12/6/000715468.zip |
|