无向图染色
题目描述:
给一个无向图染色,可以填红黑两种颜色,必须保证相邻两个节点不能同时为红色,输出有多少种不同的染色方案?
输入输出描述:
输入描述:
第一行输入M(图中节点数) N(边数)
后续N行格式为:V1 V2表示一个V1到V2的边。
数据范围:1 <= M <= 15,0 <= N <= M * 3,不能保证所有节点都是连通的。
输出描述:
示例1:
输入:
4 4
1 2
2 4
3 4
1 3
输出:
7
说明:4个节点,4条边,
1号节点和2号节点相连,
2号节点和4号节点相连,
3号节点和4号节点相连,
1号节点和3号节点相连,
若想必须保证相邻两个节点不能同时为红色,总共7种方案。
解题思路:
1、使用邻接表来记录下每个点的邻接点有哪些。
2、回溯/递归进行染色,如果当前节点已经被染色,则对下一个点染色;若当前节点没有被染色,则尝试染色黑色、红色(其邻接节点只能被染成黑色)是否违背染色规则。
3、在染色的过程中统计出有多少次没有违规染色的情况下,所有节点都被染色了。
代码:
// 记录那些点已经被染色
static int[] colored;
static int res;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] split = scanner.nextLine().split(" ");
int m = Integer.parseInt(split[0]);