【题目描述】
给定无向连通图 G 和 M 种不同的颜色,用这些颜色为图 G 的各顶点着色, 每个顶点着一种颜色。如果有一种着色法使 G 中每条边的 2 个顶点着不同的颜 色,则称这个图是 M 可着色的。图的 M 着色问题是对于给定图 G 和 M 种颜色, 找出所有不同的着色法。 对于给定的无向连通图 G 和 M 种不同的颜色,编程计算图的所有不同的着色法。
【输入】
第一行有 3 个正整数 N,K 和 M,表示给定的图 G 有 N 个顶点和 K 条边,M 种 颜色。顶点编号为 1,2……,N。接下来的 K 行中,每行有 2 个正整数 U,V, 表示图 G 的一条边(U,V)。数据范围:1<N<=100 1<K<=2500 1<M<=6
【输出】
不同的着色方案数
【样例输入】
5 8 4 1 2 1 3 1 4 2 3 2 4 2 5 3 44 5
【样例输出】
48
============题解============
Dfs。
可以用栈来存图,下标是点编号,每次把这个点所联通的点编号push_back进去,注意这里要正反各存一遍。然后开一个数组a[i][j],记录第i个点所联通的点中为第j种颜色的点的数量,dfs时遍历每一个点,枚举每种颜色,当a[i][j]为0时此点才可以被染色,那么就将此点所连的所有点的a[i][j]++,之后递归,出函数后恢复,每次递归时计数++,当达到点数时ans++。