当前位置 博文首页 > 爱新觉罗?炒饭的博客:图的m着色问题(子集树回溯法)

    爱新觉罗?炒饭的博客:图的m着色问题(子集树回溯法)

    作者:[db:作者] 时间:2021-06-21 09:38

    在这里插入图片描述

    在这里插入图片描述
    解空间:子集树

    题目比较容易,直接附代码
    代码

    #include <iostream>
    using namespace std;
    int n;               //图的顶点数
    int x[100];          //当前解
    int a[100][100];     //邻接矩阵
    int m;               //可用颜色数量
    int sum = 0;        //当前已经找到的可m着色方案数
    bool OK(int t)
    {
       for (int i = 1; i < t;i++)
       {
          if(a[t][i]==1&&x[t]==x[i])   //将当前扩展结点与已加入顶点集的顶点逐一比较,当两顶点有边且颜色相同返回错误
             return false;
       }
       return true;
    }
    void Backtrack(int t)
    {
       if(t>n)      //搜索到叶子节点
       {
          sum++;
          for (int i = 1; i <= n;i++)
             cout << x[i] << " ";
          cout << endl;
       }
       else
       {
          for (int i = 1; i <= m;i++)
          {
             x[t] = i;
             if(OK(t))
                Backtrack(t + 1);
             x[t] = 0;
          }
       }  
    }
    int main()
    {
       cout << "请输入顶点数和着色数" << endl;
       cin >> n >> m;
       cout << "请输入邻接矩阵" << endl;
       for (int i = 1; i <= n;i++)
          for (int j = 1; j <= n;j++)
             cin >> a[i][j];
       cout << "着色所有可能的解:\n";
       Backtrack(1);
       cout << "着色可能解的总数为:" << sum << endl;
       return 0;
    }