zoukankan      html  css  js  c++  java
  • 回溯法 | 图的m着色问题

    学习链接:算法 图的M着色问题


    虽然今早9点才醒来,10点才来教室,但是coding得很高效。吃个早餐,拉个粑粑的时间,就把算法书上的【图的m着色】问题看明白了,大脑里也形成了解决问题的框架。

    其实这个问题很简单,也是使用回溯法的解题方案。半局LOL的功夫,就coding完成。经过简单调试后得到了与书上一样的输出。

    Java代码:

     1 import java.util.*;
     2 
     3 
     4 public class Main {
     5 
     6     public static void main(String[] args) {
     7         //图的m色 demo
     8         int adjMatrix[][]={
     9                 {0,1,1,1,0},
    10                 {1,0,1,1,1},
    11                 {1,1,0,1,0},
    12                 {1,1,1,0,1},
    13                 {0,1,0,1,0}
    14         };
    15         M_Color_In_Graph problem=new M_Color_In_Graph(adjMatrix,4);
    16         System.out.print(problem);
    17         int a;
    18         a=0;
    19         
    20     }
    21 }
    22 
    23 class M_Color_In_Graph{
    24     int vexnum=0;//顶点数目
    25     int[][] adjMatrix;//邻接矩阵
    26     int m=0;
    27     List<int[]> solved =new ArrayList<int[]>();//解向量组
    28     public String toString(){
    29         int i,j;
    30         String str=new String("");
    31         for(i=0;i<solved.size();i++){
    32             int [] out=solved.get(i);
    33             for(j=0;j<out.length;j++){
    34                 str+=out[j];
    35                 str+=" ";
    36             }
    37             str+="
    ";
    38         }
    39         str+="total="+solved.size();
    40         return str;
    41     }
    42     M_Color_In_Graph(int[][] adj,int m){
    43         adjMatrix=adj;
    44         vexnum=adj.length;
    45         this.m=m;
    46         BackTrace(0,null);
    47     }
    48     void BackTrace(int t,int[] x){//对顶点t进行着色,父结点的解向量为x
    49         if(t<vexnum){
    50             int i,j;
    51             //对x的下标t赋m个值
    52             for(i=0;i<m;i++){
    53                 int[] cx=new int[vexnum];    //新建子结点
    54                 for(j=0;j<t;j++) cx[j]=x[j];//拷贝父结点
    55                 cx[t]=i;
    56                 if(contraint(cx,t)) BackTrace(t+1,cx);
    57             }
    58         }else{//着色完毕
    59             solved.add(x);
    60         }
    61     }
    62     boolean contraint(int[] x,int len){//约束函数
    63         //对图进行遍历。如果【所有结点】满足【图中两个结点连通,并且颜色不等】,true。
    64         int i,j;
    65         for(i=0;i<len;i++){
    66             for(j=i+1;j<=len;j++){
    67                 if( adjMatrix[i][j]>0 //如果图是连通的
    68                     && x[i]==x[j] ){//但是这两个顶点颜色相同
    69                     return false;
    70                 }
    71             }
    72         }
    73         return true;
    74     }
    75 }
  • 相关阅读:
    codewars sum of pairs
    codewars贪吃蛇算法题目
    记录一道有意思的js题目
    JS判断变量类型
    mock之初体验
    three.js尝试(二)模拟游戏开发:3D人物在地图上行走
    three.js尝试(一)模拟演唱会效果
    Vue中父组件使用子组件的emit事件,获取emit事件传出的值并添加父组件额外的参数进行操作
    网易前端工程师课程中,布局解决方案
    js飘窗
  • 原文地址:https://www.cnblogs.com/TQCAI/p/7666160.html
Copyright © 2011-2022 走看看