题目
问题描述
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
直接看代码吧,跑过了,ac了
DFS(深度优先搜索)+ 回溯问题
用递归代码容易理解和实现
#include<iostream>
using namespace std;
int n;//人数
int mina;//目前最少的房间数
int p[102][102]={0};
int map[102][102]={0};
void DFS (int x,int kes){
if(kes>=mina) //剪下枝
return ;
if(x>n){//不断更新最小值
if(kes<mina)
mina=kes;
return ;
}
for(int i=1;i<=kes;i++){
int count=0;
while (p[i][count] && !map[x][p[i][count]])
count++;//判断当下的房间 目前 存在的人是否有关系
if(p[i][count]==0){//如果没有 就坐下
p[i][count]=x;
DFS(x+1,kes);
p[i][count]=0;//回溯:回溯的意思即是 如果不先坐下 而是 开另一个考场 看看最后的教室数目会怎样化
}
}
p[kes+1][0]=x;
DFS(x+1,kes+1);
// p[kes+1][0]=0; 之前看到好多人写的博客这里都写了回溯,但是我不清楚在题目中实际的作用是什么,而且我在跑样例的时候也没有出现问题 希望有大佬的解释下 到底是不是必要的
}
int main (){
int t,a,b;
cin>>n;
cin>>t;
mina=n;
while(t--){
cin>>a>>b;
map[a][b]=map[b][a]=1;
}
DFS(1,0);
cout<<mina<<endl;
return 0;
}