回溯法——图m染色问题

简介: 回溯法——图m染色问题

给定无向连通图G和m种颜色,要求用这些颜色给定点着色要求,每个顶点颜色和相邻顶点不相同。

算法思想:依次对每个点尝试着色,如果颜色重复就换下一个颜色。

#include<iostream>
#include<vector>
using namespace std;
//给定无向连通图G和m种颜色,要求用这些颜色给定点着色要求,每个顶点颜色和相邻顶点不相同。
vector<vector<int>> c(4, vector<int>(4, 0));//图
vector<int> color(4,0);//第i个顶点的颜色
//判断相邻顶点颜色是否重复
bool same(vector<vector<int>> c, int v, vector<int> color) {
  for (int i = 0; i < c[0].size(); i++) {
    if (c[v][i] == 1) {
      if (color[v] == color[i]) {
        return true;
      }
    }
  }
  return false;
}
//算法思想:依次对每个点尝试着色,如果颜色重复就换下一个颜色
void dfs(int k,vector<vector<int>> c, vector<int> color, int m) {//第k个顶点,总共m种颜色,color为染色结果,c为邻接表
  if (k==4) {
    for (auto it : color) {
      cout << it << " ";
    }
    cout << endl;
  }
  else {  
      for (int j = 1; j <= m; j++) {
        color[k]=j;
        if (!same(c,k,color)) {
          dfs(k + 1, c, color, m);
        }
      }   
  }
}
int main() {
  c[0][1] = 1;
  c[1][0] = 1;
  c[1][2] = 1;
  c[2][1] = 1;
  c[2][3] = 1;
  c[3][2] = 1;
  c[3][0] = 1;
  c[0][3] = 1;//对边进行初始化
  dfs(0, c, color, 5);
  //for (auto it : color) {
  //  cout << it << " ";
  //}
}

给定无向连通图G,要求每个顶点颜色和相邻顶点不相同,求最少要用多少种颜色。

算法思想:每次尝试n种颜色,去着色,1<n<顶点个数,如果能给所有顶点上色则输出n。

#include<iostream>
#include<vector>
using namespace std;
//给定无向连通图G和m种颜色,要求用这些颜色给定点着色要求,每个顶点颜色和相邻顶点不相同。
vector<vector<int>> c(4, vector<int>(4, 0));//图
vector<int> color(4,0);//第i个顶点的颜色
//判断相邻顶点颜色是否重复
bool same(vector<vector<int>> c, int v, vector<int> color) {
  for (int i = 0; i < c[0].size(); i++) {
    if (c[v][i] == 1) {
      if (color[v] == color[i]) {
        return true;
      }
    }
  }
  return false;
}
bool solved = false;
//算法思想:依次对每个点尝试着色,如果颜色重复就换下一个颜色
void dfs(int k,vector<vector<int>> c, vector<int> color, int m) {//第k个顶点,总共m种颜色,color为染色结果,c为邻接表
  if (k==4) {
    //for (auto it : color) {
    //  cout << it << " ";
    //}
    //cout << endl;
    solved = true;
  }
  else {  
      for (int j = 1; j <= m; j++) {
        color[k]=j;
        if (!same(c,k,color)) {
          dfs(k + 1, c, color, m);
        }
      }   
  }
}
int main() {
  c[0][1] = 1;
  c[1][0] = 1;
  c[1][2] = 1;
  c[2][1] = 1;
  c[2][3] = 1;
  c[3][2] = 1;
  c[3][0] = 1;
  c[0][3] = 1;//对边进行初始化
  for (int i = 1; i < 5; i++) {
    dfs(0, c, color, i);
    if (solved) {
      cout << i << endl;
      break;
    }
  }
}
相关文章
数据结构实验之图论二:图的深度遍历
数据结构实验之图论二:图的深度遍历
|
7月前
|
存储 算法
图的深度优先算法
图的深度优先算法
50 0
|
7月前
|
NoSQL 容器 消息中间件
图、图的遍历及图的拓扑排序
图、图的遍历及图的拓扑排序
|
存储 索引
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
82 0
|
Cloud Native 算法 Go
886. 可能的二分法:图+深度优先算法
这是 力扣上的 886. 可能的二分法,难度为 中等。
|
存储 索引
搜索与图论-树与图的广度优先遍历
搜索与图论-树与图的广度优先遍历
|
算法
|
存储 算法 C++
C++实现图 - 03 最小生成树
这一讲来讲一个图中非常重要的内容 —— 最小生成树,在此之前我们先来回顾一下生成树的概念。
236 0
C++实现图 - 03 最小生成树
|
存储 算法 搜索推荐
C++实现图 - 05 拓扑排序
今天来讲另一个非常重要的知识点 —— 拓扑排序。咋一看好像是一个排序算法,然而它和排序扯不上半点关系,它可以用于判断我们的图中是否存在有向环。
650 0
C++实现图 - 05 拓扑排序

热门文章

最新文章