题目描述
谢老师准备建设自己的题库,由于工作量实在太大了,他决定请他的N个学生来帮忙,但是有的同学待在一起就会讲话,不好好干活。他认真观察后发现有m对同学在一起就会互相讲话,所以这m对同学不能同时请来帮忙。
现状谢老师想知道,他请学生帮忙能有多少种不同的方案,请帮助他回答这个问题。
输入说明
第一行两个整数n, m(1 ≤ n ≤ 20,1 ≤ m ≤ 400)。
加下来m行,每行两个不同的整数x,y,表示x同学和y同学在一起就会聊天。
输出说明
一个整数,表示满足条件的方案数。
输入样例
3 2 1 2 2 3
输出样例
5
算法分析
可以采用分治的思想来实现。
用一个二维数组来记录学生之间两两是否会说话,用一个一位数组记录每轮递归中哪些学生已经被选择过。
第一轮先选中第1个学生,然后从第2个学生开始比较,如果第2个学生和第一个学生会相互说话且第一个学生已经被选择了,就不能选第2个学生,只能跳过去选第3个学生(这样一轮一共需要考虑n个学生)。
后面第二轮从第2个学生开始选择,以此类推,求出所有的方案数。
具体代码实现如下:
C++代码
#include <iostream>
// #include &l