回溯法--图的m着色问题--子集树
创始人
2024-05-11 09:59:25
0

问题描述

给定无向连通图和m种不同的颜色,用这些颜色为图G的各个顶点着色,每个顶点有一种颜色

是否有一种着色方法?使得图G中每条边的两个顶点有不同的颜色

这个问题就是图的m可着色判定问题

色数:如果有一个图最少需要m种颜色才能使得图中每条边连接的2个顶点有着不同的颜色,称m是这个图的色数。

著名的平面图的四色猜想就是图的m可着色判定问题的特殊情形,可平面图是什么?如果一个图的所有顶点和边都可以用某一种方式画在一个平面上,并且没有任何两条边相交,就成为可平面图。

四色猜想:

问题分析

变量声明

无向连通图G(V,E)用邻接矩阵a表示,a[ i ][ j ]=1表示i和j两个顶点之间存在一条边( i , j ),即( i , j )属于图G(V,E)的边集E。 否则,a[i][j]=0。

整数1,2,3,...,m表示m种不同的颜色

顶点i的颜色用x[ i ]表示。x[ i ]就是问题的解

解空间

解空间可以表示为一颗n+1高度的完全m叉树,第i层有m个儿子,每个儿子对应X[ i ]的一种可能性

第一层就是第一个顶点,第二层第二个顶点,...,第n+1层是最后一个顶点(叶子)。每个分支结点,都有m个儿子结点。最底层有个叶子结点。

回溯逻辑

剪枝--检查什么可行性?

可行的条件是yu当前点相邻的点不能与之同色

backtrack(int i)

完整代码

//最大团问题
#include 
#include 
#include 
#include 
using namespace std;const int maxnum = 101;
bool a[maxnum][maxnum]; //图的邻接矩阵
bool x[maxnum];         //当前解
int cn;                 //当前团的顶点数
int bestn;              //当前的最优解
int n;                  //图G的顶点数
int e;                  //图G的边数
void display(){for (int j = 1; j <= n; j++){if (x[j]) printf("%d ", j);}printf("\n");
}
void backtrack(int i){int j;if (i > n){bestn = cn;printf("%d\n", bestn);display();return;}bool ok = true;for (j = 1; j < i; j++){if (x[j] && !a[j][i]) // i与j不相连{ok = false;break;}}if (ok) //进入左子树{cn++;x[i] = true;backtrack(i + 1);cn--;}if (cn + n - i > bestn) //剪枝{x[i] = false;backtrack(i + 1);}
}int main(){int i, u, v;memset(a, false, sizeof(a));memset(x, false, sizeof(x));scanf("%d%d", &n, &e); // 定点数,边数for (i = 0; i < e; i++){scanf("%d%d", &u, &v);a[u][v] = true;a[v][u] = true;}cn = bestn = 0;backtrack(1);return 0;
}/*
5 7
1 2
1 4
1 5
2 5
2 3
3 5
4 5
*/

测试用例

输入

输入定点数,边数,着色种类数

5 8 4

1 2

1 3

1 4

2 3

2 4

2 5

3 4

4 5

输出

48

P2819 图的 m 着色问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

又是一个子集树的回溯法,分析结束。还是很像模板的。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...