经典算法问题 之 图的m-着色判定问题

来源:互联网 发布:成都知美术馆 怎么去 编辑:程序博客网 时间:2024/05/02 03:51

图的m-着色判定问题——给定无向连通图Gm种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色?

图的m-着色优化问题——若一个图最少需要m种颜

色才能使图中任意相邻的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的最小色数m的问题称为m-着色优化问题。

输入 n k  m n代表节点个数,k代表边的个数

随后跟着k行a b 代表 a b间有一个边相连接, m代表颜色的种类数m的大小

一定能符合着色的标准

输出:

输出最少的颜色数


样例输入:

5  8  6

1 3

1 2 

1 4

2 3

2 4

2 5

3 4

4 5


样例输出:

4



本题是个经典的回溯问题,因为有m种颜色,所以可以依次试探m的值,看是否满足题目的条件于是一个for循环很自然的写出:

for(i=1--->m){

if(dfs(0,m))//0个块已填好颜色,m种颜色可选

   输出m的值;

跳出循环;

}

#include<iostream>#include<cstdlib>#include<cstring>#include<vector>using namespace std;vector<int>v[10];//vactor 建图int color[10];int n,k,m;int floag;//成功找到的标志变量int IsSame(int node,int col){//判断颜色是否有冲突for(int i=0;i<v[node].size();i++){if(color[v[node][i]]==col)return 1;}return 0;}int dfs(int node,int col){if(node==n){floag=1;return 1;}for(int i=1;i<=col;i++){//col种颜色,逐个填色if(!IsSame(node,i)){color[node]=i;dfs(node+1,col);if(floag)return 1;color[node]=0;}}return 0;}int main(){cin>>n>>k>>m;memset(color,0,sizeof(color));for(int i=0;i<k;i++){int x,y;cin>>x>>y;v[x].push_back(y);v[y].push_back(x);}for(int col=1;col<=m;col++){//memset(color,0,sizeof(color));if(dfs(0,col)){cout<<col<<endl;break;}}return 0;}




原创粉丝点击