回溯法之地图着色

≡放荡痞女 提交于 2019-11-26 20:19:09
//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);
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!