回溯法之地图着色

//program 5-3
#include <iostream>
#include <string.h>
#define MX 50
using namespace std;

int x[MX];         //解分量
int map[MX][MX];  //图的邻接矩阵
int sum=0;   //记录解的个数
int n,m,edge;  //节点数和颜色数

//创建邻接矩阵
void CreatMap()
{
    int u,v;
    cout << "请输入边数:";
    cin >> edge;
    memset(map,0,sizeof(map));//邻接矩阵里面的数据初始化为0,meset需要引入#include <string.h>
    cout << "请依次输入有边相连的两个结点u和v,用空格分开:";
    for(int i=1;i<=edge;i++)
    {
        cin>>u>>v;
        map[u][v]=map[v][u]=1;
    }
}
//约束条件
bool OK(int t)
{
    for(int j=1;j<t;j++)
    {
        if(map[t][j])      //如果t与j邻接
        {
            if(x[j]==x[t]) //判断t与j的着色号是否相同
                return false;
        }
    }
    return true;
}
//搜索函数
void Backtrack(int t)
{

    if(t>n) //到达叶子,找到一个着色方案
    {
        sum++;
        cout<<""<<sum<<"种方案:";
        for(int i=1;i<=n;i++) //输出该着色方案
            cout<<x[i]<<" ";
        cout<<endl;
    }
    else{
        for(int i=1;i<=m;i++) //每个结点尝试m种颜色
        {
            x[t]=i;
            if(OK(t))
                Backtrack(t+1);
        }
    }
}
int main()
{
    cout<<"输入节点数: ";
    cin>>n;
    cout<<"输入颜色数: ";
    cin>>m;
    cout<<"输入无向图的邻接矩阵:"<<endl;
    CreatMap();
    Backtrack(1);
}
//program 5-3
#include <iostream>
#include <string.h>
#define MX 50
using namespace std;

int x[MX];         //解分量
int map[MX][MX];  //图的邻接矩阵
int sum=0;   //记录解的个数
int n,m,edge;  //节点数和颜色数

//创建邻接矩阵
void CreatMap()
{
    int u,v;
    cout << "请输入边数:";
    cin >> edge;
    memset(map,0,sizeof(map));//邻接矩阵里面的数据初始化为0,meset需要引入#include <string.h>
    cout << "请依次输入有边相连的两个结点u和v,用空格分开:";
    for(int i=1;i<=edge;i++)
    {
        cin>>u>>v;
        map[u][v]=map[v][u]=1;
    }
}
//约束条件
bool OK(int t)
{
    for(int j=1;j<t;j++)
    {
        if(map[t][j])      //如果t与j邻接
        {
            if(x[j]==x[t]) //判断t与j的着色号是否相同
                return false;
        }
    }
    return true;
}
//搜索函数
void Backtrack(int t)
{

    if(t>n) //到达叶子,找到一个着色方案
    {
        sum++;
        cout<<""<<sum<<"种方案:";
        for(int i=1;i<=n;i++) //输出该着色方案
            cout<<x[i]<<" ";
        cout<<endl;
    }
    else{
        for(int i=1;i<=m;i++) //每个结点尝试m种颜色
        {
            x[t]=i;
            if(OK(t))
                Backtrack(t+1);
        }
    }
}
int main()
{
    cout<<"输入节点数: ";
    cin>>n;
    cout<<"输入颜色数: ";
    cin>>m;
    cout<<"输入无向图的邻接矩阵:"<<endl;
    CreatMap();
    Backtrack(1);
}

猜你喜欢

转载自www.cnblogs.com/xjyxp/p/11332517.html