算法设计与分析实验1-基于回溯算法的图着色解决方法

一、实验目的:

理解图着色问题的定义、掌握相关算法以及实现。

二、实验内容:

  1. 掌握图着色问题的定义
  2. 了解图着色算法
  3. 实现算法

三、实验任务解决方案:

1、图着色算法的流程图:

算法设计与分析实验1-基于回溯算法的图着色解决方法_第1张图片

2、图着色算法实现的关键代码:

(1)着色:
public void mColoring(int k){  //backtracking function
        for(int i=1;i<=n;i++){
            next_color(k);  //coloring kth vertex
            if(x[k]==0)
                return;  //if unsuccessful then backtrack
            if(k==n)  //if all colored then show
                write();
            else
                mColoring(k+1);  /* successful but still left to color */
        }
    }
(2)判断相连颜色是否一致
private void next_color(int k){
        do{
            int i=1;
            x[k]=(x[k]+1)%(m+1);
            if(x[k]==0)
                return;
            for(i=1;i<=n;i++)
                if(G[i][k]==1 && x[k]==x[i])  /* checking adjacency and not same color */
                    break;
            if(i==n+1)   return;  //new color found
        }while(true);
    }

3、运行结果:

算法设计与分析实验1-基于回溯算法的图着色解决方法_第2张图片

四、图着色算法的计算复杂度分析(最好、最差、平均情况复杂度):

该算法的复杂度跟顶点的个数n,颜色的种数m有关。最好情况的复杂度为O(m*n);最坏情况的复杂度为O(m*n2);平均情况复杂度为O(m*n2)。

附:项目源代码
public class MWayGrColor{
    /*G is graph's adjacency matrix and x is solution vector */
    private int G[][],x[],n,m,soln;

    public void mColoring(int k){  //backtracking function
        for(int i=1;i<=n;i++){
            next_color(k);  //coloring kth vertex
            if(x[k]==0)
                return;  //if unsuccessful then backtrack
            if(k==n)  //if all colored then show
                write();
            else
                mColoring(k+1);  /* successful but still left to color */
        }
    }

    private void next_color(int k){
        do{
            int i=1;
            x[k]=(x[k]+1)%(m+1);
            if(x[k]==0)
                return;
            for(i=1;i<=n;i++)
                if(G[i][k]==1 && x[k]==x[i])  /* checking adjacency and not same color */
                    break;
            if(i==n+1)   return;  //new color found
        }while(true);
    }

    private void write(){
        System.out.print("\n方案"+(++soln)+"-->");
        for(int i=1;i<=n;i++)
            System.out.print("\t("+x[i]+")");  //solution vector
    }

    public void input(){
        java.util.Scanner sc=new java.util.Scanner(System.in);
        System.out.print("输入顶点数 : ");
        n=sc.nextInt();
        G=new int[n+1][n+1];
        x=new int[n+1];
        System.out.print("输入颜色数 : ");
        m=sc.nextInt();
        System.out.println("输入邻接矩阵-->");
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                G[i][j]=sc.nextInt();
    }

    public static void main (String[] args) {
        MWayGrColor obj=new MWayGrColor();
        obj.input();
        obj.mColoring(1);
        if(obj.soln==0)
            System.out.println("\n无解决方案");
        else
            System.out.print("\n总方案数 : "+obj.soln);
    }
}

你可能感兴趣的:(算法,算法,图着色,回溯算法)