题目如下
n 个人参加某项特殊考试。
为了公平,要求任何两个认识的人不能分在同一个考场。
求是少需要分几个考场才能满足条件。
输入描述
输入格式:
第一行,一个整数 n (1≤n≤100),表示参加考试的人数。
第二行,一个整数 m,表示接下来有 m 行数据。
以下 mm 行每行的格式为:两个整数 a,ba,b,用空格分开1≤a,b≤n )表示第 a 个人与第 b个人认识。
输出描述
输出一行一个整数,表示最少分几个考场。
输入输出样例
示例
输入
5
8
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
输出
4
题目解析
本题可以看成无向图染色问题,n个同学n个点,相互认识的点不能有相同的个颜色,既不能放在同一房间,所以该题可以简单解释为相邻顶点不能染相同的个颜色,问至少需要多少颜色。
要求求出最少而且所有学生必须都有,那么我们采用DFS和剪枝策略,同时两者的关系我们利用二维数组来表示。
由于在求这个最小的教室数时,前一次的选择会影响后一步的执行(比如说当第 ii 个同学无论选没选第 xx 间教室,其都会对第 i+1i+1 及其之后的同学造成影响),因此我们把被安排学生的序号和当前已经用掉了多少间教室作为参数来进行传递。在第一次调用的时候我们采用dfs(1, 0),来安排第一位同学,之后我们会进行剪枝,查看是否现在的房间数大于了之前计算的最小值,否则就将该值设为最小值。
接着会进行循环,遍历所有的房间,进行判断x是否可以入住,然后进行下一次搜索和回溯。
代码如下
maxn = 1005
ans = 10000000
a = [[0 for _ in range(maxn)] for _ in range(maxn)]# 用于储存关系,1就是关联
c = [