回溯法图的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...
原文地址:https://www.cnblogs.com/chenbin7/p/2195209.html