题目描述
给定无向连通图 G 和 m 种不同的颜色。用这些颜色为图 G 的各顶点着色,每个顶点着一种颜色。如果有一种着色法使 G 中每条边的 22 个顶点着不同颜色,则称这个图是 m 可着色的。图的 m 着色问题是对于给定图 G 和 m 种颜色,找出所有不同的着色法。
输入
第 1 行有 3 个正整数n,k,m,表示给定的图 G 有 n 个顶点和 k 条边,m 种颜色。顶点编号为 1,2,…,m。接下来的 k 行中,每行有 2 个正整数 u,v,表示图 G 的一条边(u,v)。
输出
将计算出的不同的着色方案数输出。
样例输入输出
样例输入 #1
5 8 4 1 2 1 3 1 4 2 3 2 4 2 5 3 4 4 5
样例输出 #1
48
数据范围
数据保证,1≤n≤100,1≤k≤2500。
在 n 很大时保证 k 足够大。
保证答案不超过 20000。
数据为在满足上述条件的合法数据中随机采样得到。
差不多是这样的:
分析:
1.判断颜色是否符合要求
对于每个节点 u,如果它与另一个节点 v 有边相连,且这两个节点颜色相同,那么就不能把节点 u 涂为该颜色。因此,需要定义一个函数 ok() 来判断某个节点染上某种颜色是否符合要求。具体来说,ok(u, c) 函数返回值为true表示节点 u 可以涂上颜色 c,否则返回false。
2.使用深度优先搜索
使用深度优先搜索(DFS)从解空间树的根节点开始搜索,并在每个分支结点处调用 ok() 函数来剪枝。如果在整棵解空间树中找到了一组可行解,那么算法就停止搜索并输出结果。如果找不到任何一个可行解,则算法输出无解信息。
具体实现过程:
首先,需要定义一个二维数组 G[ ][ ],用于存储图中的边。其中,G[u][v] == 1 表示节点 u 和节点 v 之间有边相连,反之为 0。同时,还需要定义一个一维数组 color[ ],用于存储每个节点的颜色。
首先将所有边权赋值为 0,即不存在边。然后,读入所有边,将对应的边权赋值为 1。读入颜色数 m,并从节点 1 开始做深度优先搜索,依次尝试给每个节点涂上不同的颜色。在每个分支结点处,使用 ok() 函数来判断是否符合要求。如果染色成功,则继续对下一个节点做深度优先搜索。如果找到了一组可行解,则输出结果
<