编程之美:1.9高效率安排见面会 图的m着色问题 回溯法
原书问题,可以转换为图的m着色问题 ,下面该问题的代码
这里有参考ppt与code,免积分载
http://download.csdn.net/detail/u011467621/6341195
// 1.9.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "iostream" #include "stdio.h" using namespace std; bool ColoringGraph(int G[][5],int n,int m); bool IsOk(int G[][5],int color[],int k,int n) ; int G[5][5]={{0,1,1,0,0},{1,0,1,1,1},{1,1,0,0,1},{0,1,0,0,1},{0,1,1,1,0}}; int _tmain(int argc, _TCHAR* argv[]) { int n=5,m=3; ColoringGraph(G,n,m); return 0; } bool ColoringGraph(int G[][5],int n,int m) //n是图的定点个数,G是图的连接矩阵,Gij=1说明i定点与j定点有连接。m是最多可以上的色 //若输出有效上色,返回1,否则返回0 { int *color=new int[n]; for(int i=0;i<n;i++)//给每个顶点颜色初始化为0 color[i]=0; int k=0; while(k>=0)//k代表顶点个数,当k回溯到0说明已经没有可行解了 { while(color[k]<=m) { color[k]++; if (IsOk(G,color,k,n)) break; } if(color[k]<=m && k==n-1) { cout<<"OK"; for(int j=0;j<n;j++) cout<<color[j]; return 1; } else if(color[k]<=m && k<n-1) { k++; } else//若k>m,说明此路不同回溯到上一层 { color[k]=0; k--; } } return 0; } bool IsOk(int G[][5],int color[],int k,int n) //判断是否有相同色的顶点,与之是一个边的 { for(int i=0;i<n;i++) { if(G[i][k]==1 && color[i]==color[k]) return false; } return true; }
参考文献:
http://wenku.baidu.com/view/d7242fd1c1c708a1284a444d.html
欢迎拍砖,交流。感谢您的阅读,若您想支持一下本文,麻烦顶一下,您的鼓励,是我的动力,谢谢!- -
欢迎转载本文,
转载时请附上本文地址:http://www.cnblogs.com/Dzhouqi/p/3346466.html
另外:欢迎访问我的博客 http://www.cnblogs.com/Dzhouqi/