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入门到精通教程
查看: 988|回复: 0

[算法学习]贪心法解图的着色问题(JAVA)

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

    [LV.1]初来乍到

    发表于 2014-12-6 00:07:14 | 显示全部楼层 |阅读模式
    着色问题。
        给一个无向图的所有结点着色,限制是一条边的两个端点不能用同样的颜色,要求所使用的不同颜色的数目最少。    “贪心”算法的思想是首先 用第一种颜色对图中尽可能多的顶点着色(“尽可能多”表现出“贪心”);然后用第二种颜色对余下的顶点中尽可能多的顶点着色;如此等等,直到把所有的顶点都着完色。当用一种新颜色对余下的顶点着色时,我们采取下列步骤:  (1)选取某个未着色的顶点,并且用新颜色对它着色。  (2)扫描所有未着色的顶点集,对其中的每个顶点,确定它是否与已着新颜色的任何顶点相邻。若不相邻,则用新颜色对它着色。  while 有结点未着色; {
        选择一种新颜色;
        在未着色的结点中,给尽可能多的彼此结点之间没有边点着色; }

       
      
       
       

         
       

         
       
      
    代码:
    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. /*
    12. 0 1
    13. 1 0
    14. */
    15. /*
    16. 0 1 1 0
    17. 1 0 1 1
    18. 1 1 0 1
    19. 0 1 1 0
    20. */
    21. /*
    22. 0 1 1 1
    23. 1 0 1 1
    24. 1 1 0 1
    25. 1 1 1 0
    26. */
    27. public class GRcolor{

    28. int n;//顶点数
    29. int[] color;//color[k]=m表示第k个顶点着色m
    30. int[][] c;//邻接矩阵
    31. public GRcolor(int n,int[][]c){
    32.     this.n=n;
    33.     this.c=c;
    34.     color=new int[n+1];
    35. }
    36. private boolean ok(int k,int r)//判断顶点k的着色是否发生冲突
    37. {
    38.    
    39.     for(int i=1;i< n;i++){
    40.         if(color[i]!=r) continue;
    41.         if(c[k][i]==1&&color[i]==r )
    42.             return true;
    43.     }
    44.     return false;
    45. }
    46. private int  graphcolor()
    47. {
    48.     for(int i=1;i<=n;i++)
    49.         color[i]=0;//初始化
    50.     int k=1,m=0,sum=0;
    51.     while(sum< n){
    52.             m++;
    53.         for(int i=1;i<=n;i++){
    54.           if(color[i]==0){
    55.                 k=i;
    56.                 color[k]=m;
    57.                 sum++;
    58.                 break;
    59.           }
    60.          }
    61.          
    62.          for(int i=k+1;i<=n;i++){
    63.             if(color[i]!=0) continue;
    64.             if (ok(i,m)) continue;
    65.             else {
    66.              color[i]=m;
    67.              sum++;
    68.               
    69.             }
    70.         }
    71.       
    72.      }
    73.    
    74.     System.out.printf("着色方案:
    75. ");
    76.      //求解完毕,输出着色方案
    77.      for(int i=1;i<=n;i++){
    78.                System.out.printf("%d ",color[i]);
    79.             
    80.     }
    81.     System.out.println();
    82.      return m;
    83. }
    84. public static void main(String args[]){
    85.     Scanner in=new Scanner(System.in);
    86.     System.out.printf("输入顶点数n
    87. ");
    88.     int n=in.nextInt();
    89.      int[][] c=new int[n+1][n+1];//存储n个顶点的无向图的数组
    90.     System.out.printf("输入无向图的邻接矩阵:
    91. ");
    92.     for(int i=1;i<=n;i++)
    93.         for(int j=1;j<=n;j++)
    94.             c[i][j]=in.nextInt();;
    95.    
    96.     GRcolor gc=new GRcolor(n,c);
    97.     int m=gc.graphcolor();
    98.     System.out.println("最小着色数="+m);
    99. }
    100. }
    复制代码
    运行:
    输入顶点数n
    5
    输入无向图的邻接矩阵:
    0 1 1 1 0
    1 0 1 1 1
    1 1 0 1 0
    1 1 1 0 1
    0 1 0 1 0
    着色方案:
    1 2 3 4 1
    最小着色数=4

    C:java>java   GRcolor
    输入顶点数n
    2
    输入无向图的邻接矩阵:
    0 1
    1 0
    着色方案:
    1 2
    最小着色数=2

    C:java>java?? GRcolor
    输入顶点数n
    4
    输入无向图的邻接矩阵:
    0 1 1 0
    1 0 1 1
    1 1 0 1
    0 1 1 0
    着色方案:
    1 2 3 1
    最小着色数=3




      
      
       
       

         
       

         
       
      
    复制代码

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-25 04:10 , Processed in 0.350369 second(s), 47 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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