题目大意:有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倍以上!