题目链接:7.分考场 - 蓝桥云课 (lanqiao.cn)
思路:枚举所有考生的排位情况,进行剪枝
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 1010
int n,m,ans=110;
bool g[N][N];
vector<int> js[N];
// u 学生编号 cnt 教室数量
void dfs(int u,int cnt){
if(cnt>=ans)return;
if(u==n+1){
ans=min(ans,cnt);
return;
}
bool f=true;
// 枚举所有教室
for(int i=1;i<=cnt;i++){
bool ff=false;
for(auto it:js[i])if(g[u][it])ff=true;
// 如果没有认识的就可以放进去
if(!ff){
js[i].push_back(u);
dfs(u+1,cnt);
js[i].pop_back();
f=false;
}
}
// 新给他开一个
// 不管有没有教室都新开一个
js[cnt+1].push_back(u);
dfs(u+1,cnt+1);
js[cnt+1].pop_back();
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u][v]=1;
g[v][u]=1;
}
dfs(1,0);
cout<<ans<<endl;
return 0;
}