`
128kj
  • 浏览: 604485 次
  • 来自: ...
社区版块
存档分类
最新评论

采用贪心法求解着色问题(JAVA)

阅读更多
贪心法求解着色问题。
  给图的所有结点着色,限制是一条边的两个端点不能用同样的颜色,要求所使用的不同颜色的数目最少。

“贪心”算法的思想是首先  用第一种颜色对图中尽可能多的顶点着色(“尽可能多”表现出“贪心”);然后用第二种颜色对余下的顶点中尽可能多的顶点着色;如此等等,直到把所有的顶点都着完色。当用一种新颜色对余下的顶点着色时,我们采取下列步骤:

(1)选取某个未着色的顶点,并且用新颜色对它着色。

(2)扫描所有未着色的顶点集,对其中的每个顶点,确定它是否与已着新颜色的任何顶点相邻。若不相邻,则用新颜色对它着色。

while  有结点未着色;

   {  选择一种新颜色;

      在未着色的结点中,给尽可能多的彼此结点之间没有边点着色;

    }
代码:
import java.util.Scanner;
//图着色问题
/*
无向图邻接矩阵示例
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
*/

/*
0 1
1 0
*/

/*
0 1 1 0
1 0 1 1
1 1 0 1
0 1 1 0
*/

/*
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
*/
public class GRcolor{
 
 int n;//顶点数
 int[] color;//color[k]=m表示第k个顶点着色m
 int[][] c;//邻接矩阵

 public GRcolor(int n,int[][]c){
    this.n=n;
    this.c=c;
    color=new int[n+1];
 }

 private boolean ok(int k,int r)//判断顶点k的着色是否发生冲突
{
   
    for(int i=1;i<n;i++){
        if(color[i]!=r) continue;
        if(c[k][i]==1&&color[i]==r )
            return true;
    }
    return false;
}

 private int  graphcolor()
{
    for(int i=1;i<=n;i++)
        color[i]=0;//初始化
    int k=1,m=0,sum=0;
    while(sum<n){
            m++;
        for(int i=1;i<=n;i++){
          if(color[i]==0){
                k=i;
                color[k]=m;
                sum++;
                break;
          }
         }
         
         for(int i=k+1;i<=n;i++){
            if(color[i]!=0) continue;
            if (ok(i,m)) continue;
            else {
             color[i]=m;
             sum++;
              
            }
        }
      
     }
   
    System.out.printf("着色方案:\n");
     //求解完毕,输出着色方案
     for(int i=1;i<=n;i++){
               System.out.printf("%d ",color[i]);
            
    }
    System.out.println();
     return m;
}


public static void main(String args[]){
    Scanner in=new Scanner(System.in);
    System.out.printf("输入顶点数n\n");
    int n=in.nextInt();
     int[][] c=new int[n+1][n+1];//存储n个顶点的无向图的数组
    System.out.printf("输入无向图的邻接矩阵:\n");
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            c[i][j]=in.nextInt();;
    
    GRcolor gc=new GRcolor(n,c);
    int m=gc.graphcolor(); 
    System.out.println("最小着色数="+m);
 }

}



运行:
输入顶点数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

下载源码:
分享到:
评论

相关推荐

    数据结构与问题求解java版代码

    14. **回溯法**:在解决问题时尝试所有可能的路径,直到找到解决方案或确定无解,如八皇后问题、N皇后问题、图着色问题。 这个JavaAlgorithmCode资源包对于初学者和经验丰富的开发者来说都是宝贵的。通过阅读和实践...

    算法分析 递归与分治策略 动态规划 贪心算法 分支限界法 随机化算法等算法

    在IT领域,算法是解决问题的核心工具,而递归与分治策略、动态规划、贪心算法、回溯法、分支限界法以及随机化算法都是其中的重要组成部分。这些算法不仅适用于计算机科学,也在数据结构、优化问题和复杂计算中扮演着...

    java算法包括源码

    9. 回溯法和分支限界法:用于求解多解问题,如八皇后问题、迷宫求解、图的着色问题等。 10. 随机化算法:如鸽巢原理、随机化快速选择、Monte Carlo方法等,通过引入随机性提高算法效率或解决难以确定的问题。 了解...

    Java数据结构和算法(含示例代码及Applet)

    10. **递归与分治**:递归是解决问题的一种自我调用方法,分治策略将大问题分解为小问题求解。例如,快速排序和归并排序都是分治思想的应用。 11. **动态规划**:用于解决最优化问题,通过构建子问题并存储解,避免...

    算法设计ppt Java描述

    这份名为"算法设计ppt Java描述"的资料详细介绍了多种经典的算法设计策略,它们在实际编程和问题解决中扮演着至关重要的角色。以下是这些算法的详细说明: 1. **算法引论**:这是学习算法的起点,通常会涵盖算法的...

    M-coloringOfGraphs_ColoringOfGraph_

    解决图着色问题通常采用回溯法、贪心算法或者图着色算法。对于较小规模的图,可以尝试穷举所有可能的着色方案,但在大规模图中,这种方法效率低下。Java中,我们可以使用邻接矩阵或邻接表来存储图的数据结构。 1. ...

    java算法大全

    6. **回溯法**:常用于解决约束满足问题,如八皇后问题、N皇后问题、图的着色问题等,通过试探性地进行选择并适时回溯,寻找所有可能的解。 7. **分治策略**:如大整数乘法、快速傅里叶变换(FFT)、归并排序等,将...

    JAVA近百种算法大全打包.zip

    5. **回溯法**:用于解决组合优化问题,如八皇后问题、N-皇后问题、图的着色问题等。 6. **贪心算法**:在每一步选择局部最优解,期望最终得到全局最优解,如霍夫曼编码、Prim最小生成树算法、Kruskal最小生成树...

    GraphsAlgorithms:优化图3着色,顶点覆盖和独立设置

    这是一个经典的组合优化问题,有多种求解方法,如贪心算法、近似算法、以及通过线性规划或分支限界法的精确求解。在实际中,顶点覆盖问题常用于网络设计、任务调度等问题。 3. **独立集问题**: 独立集问题与顶点...

    JAVA经典算法90例

    7. **回溯法**:用于求解多解或无解问题,如八皇后问题、N皇后问题、图的着色问题等。 8. **分治策略**:将大问题分解为小问题,如归并排序、快速排序、大整数乘法等。 9. **递归与迭代**:是解决问题的两种基本...

    数据结构与算法分析(Java版).

    5. 回溯法:用于解决组合优化问题,如八皇后问题、图着色问题等。 6. 分治法:将大问题分解为小问题解决,如快速排序、归并排序、大整数乘法等。 三、高级数据结构 1. 哈希表:通过哈希函数快速查找和插入元素,...

    数据结构与算法分析(Java版英文

    6. 回溯法:尝试所有可能的解决方案,遇到错误就回溯,如八皇后问题、N皇后问题、图着色问题。 7. 近似算法:在无法找到精确解的情况下,寻找接近最优解的方法,如旅行商问题、最小割问题。 8. 图论算法:如最短路径...

    Algorithm-java-algorithms-implementation.zip

    7. 回溯法:用于解决组合优化问题,如八皇后问题、N皇后问题、图的着色问题等。 四、实战应用 掌握这些算法和数据结构,不仅能在面试中表现出扎实的基础,更能提高实际项目开发的效率。例如,在数据库索引设计中,...

    数据结构与算法分析(Java版英文).rar

    5. 回溯法:在解决问题时尝试所有可能的解决方案,如八皇后问题和图的着色问题。 6. 分支限界法:结合回溯法和剪枝策略,提高求解效率。 《数据结构与算法分析(Java版英文).pdf》这本书不仅提供了理论知识,还包括...

    Java数据结构和算法中文第二版

    - **回溯法**:用于解决约束满足问题,如八皇后问题、图的着色问题。 - **图算法**:Dijkstra算法(单源最短路径)、Floyd-Warshall算法(所有顶点间的最短路径)、Prim算法和Kruskal算法(最小生成树)。 3. **...

    这是数据结构和算法的集合_C++_Java_下载.zip

    7. **回溯法**:用于求解约束满足问题,如八皇后问题、N皇后问题、图着色问题等。 8. **分治法**:将大问题分解为小问题来解决,如归并排序、快速排序等。 通过阅读和理解这些代码,开发者不仅可以学习到数据结构和...

    数据结构与算法分析(Java版英文)

    - **回溯法**:用于解决约束满足问题,如八皇后问题、N皇后问题、图着色问题等。 - **贪心算法**:每次做出局部最优决策,期望全局最优,如霍夫曼编码、Prim算法等。 3. **复杂度分析**: - **时间复杂度**:...

    《Java数据结构与算法》中的源代码

    6. **回溯法**:用于求解多解或无解问题,如八皇后问题、图着色问题。 7. **图算法**:如深度优先搜索(DFS)、广度优先搜索(BFS)、Dijkstra最短路径算法、Floyd-Warshall所有对最短路径算法。 通过阅读和理解...

    蓝桥杯256道题目和测试数据

    7. **回溯法**:用于解决问题的深度搜索,如八皇后问题、N皇后问题、图着色问题等。 8. **分治法**:将大问题拆分成小问题,独立求解后再合并,如快速排序、归并排序、大整数乘法等。 9. **计算几何**:直线、圆、...

Global site tag (gtag.js) - Google Analytics