http://lx.lanqiao.cn/problem.page?gpid=T457
对于当前学生 先把他放到已经开的考场里 看是否和其他人都不认识 最后再尝试为他单开一个考场 这样很快就可以把n个学生都安置好 从而更新答案来剪枝
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e2+10;
int e[maxn][maxn],room[maxn][maxn];
int cnt[maxn];
int n,m,ans;
void dfs(int cur,int step)
{
int i,j;
if(step>=ans) return;
if(cur==n+1){
ans=step;
return;
}
for(i=1;i<=step;i++){
for(j=1;j<=cnt[i];j++){
if(e[cur][room[i][j]]) break;
}
if(j==cnt[i]+1){
cnt[i]++;
room[i][cnt[i]]=cur;
dfs(cur+1,step);
cnt[i]--;
}
}
cnt[step+1]++;
room[step+1][cnt[step+1]]=cur;
dfs(cur+1,step+1);
cnt[step+1]--;
}
int main()
{
int u,v;
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&u,&v);
e[u][v]=e[v][u]=1;
}
ans=n;
dfs(1,0);
printf("%d\n",ans);
return 0;
}