编程之美: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/

posted @ 2013-09-29 22:36  joey周琦  阅读(512)  评论(0编辑  收藏  举报