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

    在题目的求解过程中,遇到了关于将二维数组作为参数传递给函数的问题,纠结了半天,上网查了一些,我在下一篇日志中得总结一下了。。。

    图的m--着色问题
     1 /*
    2 图的m--着色问题分析:
    3 通过解空间分析,可推断用回溯法求解。
    4 限界条件:判断k点与其他点i存在边的情况下,为k点找到的颜色是否与i相同
    5 */
    6 #include <iostream>
    7 using namespace std;
    8
    9 int x[100];
    10
    11 int NextColor(int k,int n,int m,int **G) //寻找下一种颜色
    12 {
    13 while(1)
    14 {
    15 x[k]=(x[k]+1)%(m+1); //判断是否还有可用颜色
    16
    17 if(x[k]==0) //没有了,则返回0
    18 return 0;
    19
    20 for(int i=0;i<n;i++) //判断k结点和其他结点是否有边,以及颜色是否一样
    21 {
    22 if( ( *( (int *)G + n*k+i ) ==1) && (x[k]==x[i]) ) // *((int*)array + n*i + j);
    23 break;
    24 }
    25
    26 if(i==n) //若在k结点处,此颜色可用,则返回1
    27 return 1;
    28 }
    29 }
    30
    31 void mColoring(int k,int n,int m,int **G) //m--着色
    32 {
    33 if(NextColor(k,n,m,G)==0) //在k结点没有可用颜色
    34 {
    35 return ;
    36 }
    37
    38 if(k==n) //若结点着色完毕,输出
    39 {
    40 for(int i=0;i<n;i++)
    41 cout<<x[i]<<" ";
    42 cout<<endl;
    43 }
    44
    45 else //还有结点未着色,则令k+1结点继续着色
    46 {
    47 mColoring(k+1,n,m,G);
    48 }
    49 }
    50
    51 int main()
    52 {
    53 int G[7][7]={
    54 0,1,0,0,0,0,1,
    55 1,0,1,0,0,0,1,
    56 0,1,0,1,0,0,1,
    57 0,0,1,0,1,0,0,
    58 0,0,0,1,0,1,1,
    59 0,0,0,0,1,0,1,
    60 1,1,1,0,1,1,0
    61 };
    62
    63 mColoring(0,7,3,(int **)G);
    64
    65 return 0;
    66 }

    continue my dream...
  • 相关阅读:
    搜索--P1605 迷宫
    搜索--P1219 N皇后
    复制百度文库的技巧
    P1036 选数(DFS)
    P1217 [USACO1.5]回文质数 Prime Palindromes
    mysql常用指令
    code blocks 安装与实践
    C++ string 是否以‘’结尾 讨论
    ELK(1) ELK的安装及使用收集日志
    windows下nginx的安装及使用
  • 原文地址:https://www.cnblogs.com/chenbin7/p/2195209.html
Copyright © 2011-2022 走看看