回溯法——图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;
    }
  }
}
相关文章
|
3天前
|
存储 算法
图的深度优先算法
图的深度优先算法
19 0
|
9月前
|
算法
广度优先遍历(BFS):逐层探索图的算法奥秘
在图论中,广度优先遍历(Breadth-First Search,BFS)是一种图遍历算法,它以一种逐层的方式探索图的节点。通过从起始节点开始,逐层向外扩展,BFS能够帮助我们解决许多与图相关的问题。
79 0
|
3天前
|
NoSQL 容器 消息中间件
图、图的遍历及图的拓扑排序
图、图的遍历及图的拓扑排序
|
10月前
|
存储 索引
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
51 0
|
10月前
|
Cloud Native 算法 Go
886. 可能的二分法:图+深度优先算法
这是 力扣上的 886. 可能的二分法,难度为 中等。
|
算法
es 实现图的基本算法 图的深度优先搜索 广度优先搜索 普利姆算法
es 实现图的基本算法 图的深度优先搜索 广度优先搜索 普利姆算法
es 实现图的基本算法 图的深度优先搜索 广度优先搜索 普利姆算法
065.图的深度优先遍利
065.图的深度优先遍利
58 0
066.图的广度优先遍利
066.图的广度优先遍利
73 0