当前位置:首页 > 搜索 > 深度优先搜索 > 正文
SSOJ2370图的m着色问题
2931+

题目大意:有n个点、m条边、c种颜色,先要给每个点上颜色,连了边的点颜色不能相同,共有多少中上色方案?

题目描述

给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。

编程任务:

对于给定的无向连通图G和m种不同的颜色,编程计算图的所有不同的着色法。

输入

第1行有3个正整数n,k和m,表示给定的图G有n个顶点和k条边,m种颜色。顶点编号为1,2,…,n。接下来k行中,每行有2个正整数u,v,表示图G的一条边(u,v)。(n<=100)

输出

输出计算出的不同的着色方案数。

样例输入

5 8 4
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5

样例输出

48

解题思路

n个格子填颜色,边填边判断是否可行(可行性剪枝),可行才填色,填完累加方案数。

1、可行性剪枝:用邻接矩阵记录连边情况,用a数组记录前面的点填色情况,当第k个点要填第i种颜色时,如果前面的点j用过这种颜色(a[j]=i)而且该点与k点有边(mp[j][k]=1),则k点不能填第i中颜色。

2、启发式搜索:当一个点的颜色确定后,与他相连的点填色是数量就少1了;连边越多的点填色,能快速减少后面的点的可选颜色,从而剪枝更多,因此,我们可以按照连边量的大小,从大到小的顺序进行搜索,这样速度快了10倍以上!

程序实现

SSOJ2370图的m着色问题:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!