1、问题描述
n个人参加某项特殊考试。
为了公平,要求任何两个认识的人不能分在同一个考场。
求是少需要分几个考场才能满足条件。输入格式
第一行,一个整数n(1<n<100),表示参加考试的人数。
第二行,一个整数m,表示接下来有m行数据
以下m行每行的格式为:两个整数a,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
再比如:输入格式
5
10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
则程序应该输出:
5
2、代码实现
import java.util.Scanner;
public class 分考场 {
static int person;
static int m;
//两个人之间的关系
static int[][] relative = new int[101][101];
//每一行代表一个班级
static int[][] classes = new int[101][101];
static int ans = 99999999;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
person = scanner.nextInt();
m = scanner.nextInt();
for(int i = 0;i < m;i++) {
int a = scanner.nextInt();
int b = scanner.nextInt();
relative[a][b] = 1;
relative[b][a] = 1;
}
//从第一个人和第一个考场开始
dfs(1,1);
System.out.println(ans);
}
public static void dfs(int stu,int cla) {
//剪枝
if(cla > ans) {
return;
}
//分完考场后,更新考场数量
if(stu > person) {
ans = cla;
}else {
for(int i = 1;i <= cla;i++) {
int k = 0;
//如果当前考场的第k个位置有人,stu和当前考场第k个位置上的人没有关系
while(classes[i][k] > 0 && relative[stu][classes[i][k]] == 0) {
//寻找下一个位置
k++;
}
//当前考场的第k个位置是空的
if(classes[i][k] == 0) {
//将stu这个人加入当前考场
classes[i][k] = stu;
//下一个人
dfs(stu + 1,cla);
//回溯
classes[i][k] = 0;
}
}
//下一个考场的第一个位置肯定可以放人
classes[cla + 1][0] = stu;
//下一个人和下一个考场
dfs(stu + 1,cla + 1);
//回溯
classes[cla + 1][0] = 0;
}
}
}