记录一下错误点:一开始用了贪心,其实在想贪心的时候就应该发现有些地方解释不了,如果用贪心的话,那肯定是逐个枚举点,分别在前num个房间去试,如果在某个房间没有认识的人,就把当前这个人放到那个房间里去,如果遍历所有已有的房间都存在认识的,那就新开一个房间。关键是这样想对吗?为什么某个房间里没有认识的人就一定要放到那个房间里?那尽管有某个房间不存在认识的人,那我新开一个房间放当前这个人答案会不会更优?我们不知道,那怎么办,暴力去试,记得剪枝
附一个贪心不成立的情况 :1-3 2-4 3-4
贪心:ans = 3 dfs :ans = 2
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n,m,num = 1,ans;
bool edge[105][105];
vector<int> room[101];
void dfs(int id,int num)
{
if(num >= ans) return; //剪枝
if(id == n+1){
ans = num;
return;
}
for(int fj = 1; fj <= num; fj++){
bool isfit = true;
for(int k = 0; k < room[fj].size(); k++){
int cnt = room[fj][k];
if(edge[cnt][id]){
isfit = false;
break;
}
}
if(isfit){
room[fj].push_back(id);
dfs(id+1,num);
room[fj].pop_back();
}
}
room[++num].push_back(id);
dfs(id+1,num);
room[num].pop_back();
}
int main()
{
cin>>n>>m;
ans = n;
for(int i = 1; i <= m; i++){
int x,y;
cin>>x>>y;
edge[x][y] = edge[y][x] = true;
}
dfs(1,0);
cout<<ans;
return 0;
}