回溯--深度优先搜索(图的M着色问题 poj1129)

【回溯】图的m着色问题

题目描述

        给定无向连通图G=(V, E)和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中相邻的两个顶点有不同的颜色?
        这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的两个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。
        编程计算:给定图G=(V, E)和m种不同的颜色,找出所有不同的着色法和着色总数。



输入

第一行是顶点的个数n(2≤n≤10),颜色数m(1≤m≤n)。
接下来是顶点之间的相互关系:a b
表示a和b相邻。当a,b同时为0时表示输入结束。

输出

输出所有的着色方案,表示某个顶点涂某种颜色号,每个数字的后面有一个空格。最后一行是着色方案总数。

样例输入

5 4
1 3
1 2
1 4
2 3
2 4
2 5
3 4
4 5
0 0

样例输出

1 2 3 4 1 
1 2 3 4 3 
1 2 4 3 1 
1 2 4 3 4 
1 3 2 4 1 
1 3 2 4 2 
1 3 4 2 1 
1 3 4 2 4 
1 4 2 3 1 
1 4 2 3 2 
1 4 3 2 1 
1 4 3 2 3 
2 1 3 4 2 
2 1 3 4 3 
2 1 4 3 2 
2 1 4 3 4 
2 3 1 4 1 
2 3 1 4 2 
2 3 4 1 2 
2 3 4 1 4 
2 4 1 3 1 
2 4 1 3 2 
2 4 3 1 2 
2 4 3 1 3 
3 1 2 4 2 
3 1 2 4 3 
3 1 4 2 3 
3 1 4 2 4 
3 2 1 4 1 
3 2 1 4 3 
3 2 4 1 3 
3 2 4 1 4 
3 4 1 2 1 
3 4 1 2 3 
3 4 2 1 2 
3 4 2 1 3 
4 1 2 3 2 
4 1 2 3 4 
4 1 3 2 3 
4 1 3 2 4 
4 2 1 3 1 
4 2 1 3 4 
4 2 3 1 3 
4 2 3 1 4 
4 3 1 2 1 
4 3 1 2 4 
4 3 2 1 2 
4 3 2 1 4 
Total=48


#include 
#define NUM 12

using namespace std;
int N,M;//顶点个数和颜色数;
int Graph[NUM][NUM];//存放图的结构;
int color[NUM];//所图的颜色;
int CaseNo = 0;


bool ok(int k)
{
    for(int j = 1;j<=N;j++)
        if(Graph[j][k]==1&&color[k]==color[j]) return false;
        //是他的邻接顶点并且邻接顶点的颜色和自己的颜色相同,返回false;
    return true;

}

void DFS(int v)
{
    if(v>N){
        for(int i = 1;i<=N;i++)//依次输出涂的颜色
            cout <>N>>M;
    int a,b;
    while(cin>>a>>b&&a&&b){
        Graph[a][b] = Graph[b][a] = 1;
    }//输入;
    DFS(1);
    cout <<"Total="<




你可能感兴趣的:(算法)