思路
看的n不大,就100,我们想到直接暴力做,当然,最好还是剪枝一下,我这里用了顺序枚举,排序剪枝,中间判断一下当前的考场数量比当前的ans是否大,如果大于等于了,就不用枚举,所以就两次剪枝,我就过了
代码
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int n,ans=0x3f3f3f3f;
vector<int> v[110];int idx;//v存下每个考场的人,idx表示现在有几个考场
pair<int,int> a[110];//a存下每一个人对应的认识的人数
vector<int> f[110];//f存下每一个人认识那些人
bool cmp(pair<int,int> a,pair<int,int> b){
return a.second>b.second;
}
bool check(int u,int k){
for(int i=0;i<v[k].size();i++){
for(int j=0;j<f[u].size();j++){
if(f[u][j]==v[k][i])return false;
}
}
return true;
}
void dfs(int u){
if(idx>=ans)return;
if(u>n){
ans=min(ans,idx);
}
for(int i=0;i<idx;i++){
if(check(a[u].first,i)){
v[i].push_back(a[u].first);
dfs(u+1);
v[i].pop_back();
}
}
v[idx].push_back(a[u].first);
idx++;
dfs(u+1);
idx--;
v[idx].pop_back();
}
int main(){
int m;
cin >> n >> m;
while(m--){
int x,y;
cin >> x >> y;
a[x].first=x;
a[y].first=y;
a[x].second++;
a[y].second++;
f[y].push_back(x);
f[x].push_back(y);
}
sort(a+1,a+n+1,cmp);//把认识的人多的排在前面,后来的分支就少一些
dfs(1);
cout << ans;
}