Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1123|回复: 0

[算法学习]图的m-着色问题JAVA解答

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-12-6 00:07:15 | 显示全部楼层 |阅读模式
    图的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与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;否则,回溯,测试下一颜色。

       
      
       
       

         
       

         
       
      



    1. import java.util.Scanner;
    2. //图着色问题回溯法
    3. /*
    4. 无向图邻接矩阵示例
    5. 0 1 1 1 0
    6. 1 0 1 1 1
    7. 1 1 0 1 0
    8. 1 1 1 0 1
    9. 0 1 0 1 0
    10. */
    11. public class Gcolor{

    12. int n;//顶点数
    13. int m;//着色数
    14. int[] color;//color[k]=m表示第k个顶点着色m
    15. int[][] c;//邻接矩阵
    16. public Gcolor(int n,int m,int[][]c){
    17.     this.n=n;
    18.     this.m=m;
    19.     this.c=c;
    20.     color=new int[n+1];
    21. }
    22. private boolean ok(int k)//判断顶点k的着色是否发生冲突
    23. {
    24.    
    25.     for(int i=1;i< k;i++)
    26.         if(c[k][i]==1&&color[i]==color[k])
    27.             return false;
    28.         return true;
    29. }
    30. private void graphcolor()
    31. {
    32.     for(int i=1;i<=n;i++)
    33.         color[i]=0;//初始化
    34.     int k=1;
    35.     while(k>=1){
    36.         color[k]=color[k]+1;
    37.         while(color[k]<=m){
    38.           if (ok(k)) break;
    39.             else color[k]=color[k]+1;//搜索下一个颜色
    40.         }
    41.         if(color[k]<=m&&k==n){//求解完毕,输出解
    42.             for(int i=1;i<=n;i++)
    43.                System.out.printf("%d ",color[i]);
    44.             System.out.printf("
    45. ");
    46.         //return;//return表示之求解其中一种解
    47.         } else if(color[k]<=m&&k< n)
    48.                 k=k+1;    //处理下一个顶点
    49.         else {
    50.                 color[k]=0;
    51.                 k=k-1;//回溯
    52.         }
    53.     }
    54. }
    55. public static void main(String args[]){
    56.     Scanner in=new Scanner(System.in);
    57.     System.out.printf("输入顶点数n和着色数m:
    58. ");
    59.     int n=in.nextInt();
    60.     int m=in.nextInt();
    61.     int[][] c=new int[n+1][n+1];//存储n个顶点的无向图的数组
    62.     System.out.printf("输入无向图的邻接矩阵:
    63. ");
    64.     for(int i=1;i<=n;i++)
    65.         for(int j=1;j<=n;j++)
    66.             c[i][j]=in.nextInt();;
    67.     System.out.printf("着色所有可能的解:
    68. ");
    69.     Gcolor gc=new Gcolor(n,m,c);
    70.     gc.graphcolor();
    71. }
    72. }
    73. 运行:
    74. 输入顶点数n和着色数m:
    75. 5 4
    76. 输入无向图的邻接矩阵:
    77. 0 1 1 1 0
    78. 1 0 1 1 1
    79. 1 1 0 1 0
    80. 1 1 1 0 1
    81. 0 1 0 1 0
    82. 着色所有可能的解:
    83. 1 2 3 4 1
    84. 1 2 3 4 3
    85. 1 2 4 3 1
    86. 1 2 4 3 4
    87. 1 3 2 4 1
    88. 1 3 2 4 2
    89. 1 3 4 2 1
    90. 1 3 4 2 4
    91. 1 4 2 3 1
    92. 1 4 2 3 2
    93. 1 4 3 2 1
    94. 1 4 3 2 3
    95. 2 1 3 4 2
    96. 2 1 3 4 3
    97. 2 1 4 3 2
    98. 2 1 4 3 4
    99. 2 3 1 4 1
    100. 2 3 1 4 2
    101. 2 3 4 1 2
    102. ....................
    复制代码
    另一程序:
    1.   import javax.swing.JOptionPane;
    2. public class Coloring {
    3.     static int n,             //图的顶点数
    4.                m;             //可用颜色数
    5.     static boolean[][] a = {  //图的邻接矩阵
    6.             {false,false,false,false,false,false},
    7.             {false,false,true,true,true,false},
    8.             {false,true,false,true,true,true},
    9.             {false,true,true,false,true,false},
    10.             {false,true,true,true,false,true},
    11.             {false,false,true,false,true,false},
    12.     };
    13.     static int[] x;           //当前解
    14.     static long sum;          //当前已找到的可m着色方案数
    15.    
    16.     public static void main(String[] args) throws Exception {
    17.             n = a[0].length-1;
    18.             try {
    19.                     m = Integer.parseInt(JOptionPane.showInputDialog(null, "请输入可用的颜色数,例如:3", "输入",
    20.                                     JOptionPane.INFORMATION_MESSAGE));
    21.             } catch(NumberFormatException e1) {
    22.                     JOptionPane.showMessageDialog(null, "数据格式不正确,请重新运行程序输入!", "提示",
    23.                                     JOptionPane.WARNING_MESSAGE);
    24.                     return;
    25.             }
    26.             catch(Exception e) {
    27.                     JOptionPane.showMessageDialog(null, "程序运行过程中出现其他类型的异常!", "提示",
    28.                                     JOptionPane.WARNING_MESSAGE);
    29.                     return;
    30.             }
    31.             x = new int[n+1];
    32.             System.out.println("可行解方案数共为:" + mColoring(m));  //输出可行解方案数
    33.     }
    34.    
    35.     public static long mColoring(int mm) {
    36.             m = mm;
    37.             sum = 0;
    38.             backtrack(1);
    39.             return sum;
    40.     }
    41.    
    42.     private static void backtrack(int t) {
    43.             if(t > n) {  //搜索到叶结点
    44.                     sum++;
    45.                     for(int i=1; i<=n; i++)
    46.                             System.out.print(x[i] + " ");
    47.                     System.out.print("
    48. ");
    49.             }
    50.             else
    51.                     for(int i=1; i<=m; i++) {
    52.                             x[t] = i;
    53.                             if(ok(t)) backtrack(t+1);
    54.                             x[t] = 0;
    55.                     }
    56.     }
    57.    
    58.     private static boolean ok(int k) {  //检查颜色可用性
    59.             for(int j=1; j<=n; j++)
    60.                     if(a[k][j] && (x[j]==x[k])) return false;
    61.             return true;
    62.     }
    63. }
    64.               
    复制代码


      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/12/6/000715468.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 04:01 , Processed in 0.336034 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表