回溯法图着色问题-递归回溯
2012-11-22 10:58
204 查看
View Code
#include<iostream> using namespace std; #define N 100 int x ;//x[i]存储当前i节点的颜色种类 int a ;//存储各个顶点之间的连接情况 int sum=0;//记录有多少种涂色方案 bool OK(int k,int n){ for(int j=1;j<=n;j++) if(a[k][j]==1&&x[j]==x[k])//如果找到一个与预想把K节点涂色为x[k]的相连节点,且该节点也涂色为x[k],则涂色失败 return false; return true; //找不到则可以涂色 } void Backtrack(int t,int n,int m){//深度优先搜索 if(t>n){//如果当前节点已经为叶节点 sum++;//涂色种类加一 for(int i=1;i<=n;i++){//输入当前涂色情况 cout<<x[i]<<" "; } cout<<endl; } else{ for(int i=1;i<=m;i++){//如果当前节点不是叶节点,则在所有颜色中找出一个能把该节点涂色的颜色 x[t]=i; if(OK(t,n)) Backtrack(t+1,n,m); x[t]=0;//递归回溯时,把所有节点的涂色清空 } } } int main(){ int n,//顶点个数 m;//颜色种类 x[0]=0; cout<<"请输入节点个数:"; cin>>n; cout<<"请输入颜色种类:";cin>>m; for(int i=0;i<=n;i++){//先初始化数组的0行0列 a[0][i]=0; a[i][0]=0; } int a1,b1; cout<<"请输入两两相连的两个节点的序号(两个为一组,以(0,0)结束)"<<endl; while(a1){ cin>>a1>>b1; a[a1][b1]=1; a[b1][a1]=1; } Backtrack(1,n,m); cout<<"一共有:"<<sum<<"涂色方案"<<endl; return 0; }
相关文章推荐
- 图的m着色问题(回溯)
- Java基于循环递归回溯实现八皇后问题算法示例
- 八皇后问题(递归、非递归——回溯)
- 回溯法:最大装载问题(使用递归,不做任何优化)
- 回溯算法 图m着色问题
- HDOJ/HDU 2553 N皇后问题 回溯加递归
- 图着色问题 配色方案 C++实现 回溯法
- 三着色问题 递归和迭代方法 打印着色方案
- n皇后问题【非递归回溯】
- 回溯法:最大装载问题(使用递归,优化无最优解时候的右子树搜索)
- 图的点着色、区间着色问题及其应用(基于贪心思想的DFS回溯法求点着色问题和区间着色算法求解任务调度问题)
- C# 用回溯递归解决“八皇后”问题
- nyoj ACM:部分和问题(DFS 回溯 递归)
- 【蓝桥杯-递归回溯】八皇后问题+N皇后问题
- UVa 639 - Don't Get Rooked 类皇后问题 递归回溯
- 算法设计与分析:第五章 回溯法 5.3图的着色问题
- 回溯法:最大装载问题(使用递归,优化搜索的同时取得最佳路径)
- 递归解题 回溯 -- 火车进站问题
- N皇后问题 递归回溯
- pku 1129 Channel Allocation(回溯(经典的图着色问题))