图着色问题 配色方案 C++实现 回溯法
2015-05-21 13:12
204 查看
/* 函数功能:求解图着色问题 * 作者 :王宇虹 * 时间 :2015年5月21日 12:02:00.000 * 编译环境:Dev-C++ 5.8.3 */ #include<iostream> #include<cstring> using namespace std; int n,m,g,i; //n表示无向图中结点个数,m表示颜色个数,g表示结点关系个数 int a[10000][10000]; //只开到结点个数为10000的范围 void NextValue(int k,int m,int* x); void mColoring(int k,int m,int *x); void mColoring(int m,int *x); int main() //主函数 { memset(a,0,sizeof(a)); cout << "请输入无向图中结点的个数: "; cin >> n; cout << "请输入边的条数: "; cin >> g; cout << "请输入颜色个数: "; cin >> m; int *x = new int[100]; int u, v; for(i = 0; i < n; i++) x[i] = 0; for(i = 0; i < g; i++) { cout << "请输入边:"; cin >> u >> v; a[u][v] = a[v][u] = 1; } cout << "着色方案: " << endl; mColoring(m,x); return 0; } void NextValue(int k,int m,int* x) { //本函数在[1,m]中为x[k]确定一个值最小的,且不与其邻接点冲突的颜色 //x[k]=0表示没有可用的颜色,颜色从1开始进行编号 int j; do{ x[k]=(x[k]+1) % (m+1); //尝试下一种颜色 if(!x[k]) return; //没有可用颜色 for(j = 0; j < k; j++) { if(a[k][j] && x[k] == x[j]) //若(i,j)是图的边,且相邻结点k和j颜色相同 break; //发生冲突,选择下一种颜色 } if(j == k) return; //成功选择一种颜色返回 }while(1); } void mColoring(int k,int m,int *x) { do{ NextValue(k, m, x); //为x[k]分配颜色 if(!x[k]) break; //x[k]=0表示当前没有合适的颜色 if(k == n - 1) { //得到图G的一种m-着色方案 for(int i = 0; i < n; i++) cout<<x[i]<<' '; cout<<endl; } else mColoring(k+1,m,x); //已经对前k个结点分配了颜色,尝试其余结点 }while(1); } void mColoring(int m,int *x) { mColoring(0,m,x); }
相关文章推荐
- c++实现回溯算法解决图的M着色问题
- 采用C++实现区间图着色问题(贪心算法)实例详解
- 美国地图着色问题C++实现
- n-皇后问题 C++实现 回溯法
- 拉丁矩阵问题 利用回溯法的C++实现方案
- 最小重量问题的分支界限法的C++实现方案
- 区间图着色问题(贪心算法)C++实现
- N皇后问题(递归+回溯)的C++实现
- N皇后问题-回溯与递归-C++实现
- C++ — 智能指针的简单实现以及循环引用问题
- 蓝桥杯 问题 1466字符串对比(c++实现)
- 蓝桥杯 问题 1094: 字符串的输入输出处理(c++实现)
- 蓝桥杯 问题 1093: 字符逆序(c++实现 string)
- C++ 11新特性之用多线程实现生产者消费者问题
- 算法面试题1:约瑟夫问题(c++实现方式)
- opencv2.0以后新增C++接口的 Mat矩阵 单行赋值及矩阵合并的问题与实现
- 回溯法解决素数环问题java实现
- 01背包、完全背包、多重背包问题的C++实现
- C++单向加双向循环链表实现约瑟夫问题
- JAVA回溯, 实现 矩阵中的路径寻找问题