题目描述
n 个人参加某项特殊考试。
为了公平,要求任何两个认识的人不能分在同一个考场。
求是少需要分几个考场才能满足条件。
输入描述
输入格式:
第一行,一个整数 n ,表示参加考试的人数。
第二行,一个整数 m,表示接下来有 m 行数据。
以下 m 行每行的格式为:两个整数 a,b,用空格分开,表示第 a 个人与第 b 个人认识。
输出描述
输出一行一个整数,表示最少分几个考场。
ACcode:
#include<iostream>
#include<vector>
using namespace std;
int n, m;
bool g[110][110];//建立每个人之间的邻接矩阵
vector<int>q[110];//一个二维容器(数组)
int ans = 0x3f3f3f3f;
bool check(int i, int b)
{
for (int j = 0; j < q[i].size(); j++)
{
if (g[b][q[i][j]])//判断编号为b这个人是否于q[i]考场的编号为j的这个人认识
return false;
}
return true;
}
void dfs(int now, int cnt)//编号为几的人,考场数
{
//剪枝
if (cnt >= ans)
return;
//结束
if (now == n + 1)
{
ans = min(ans, cnt);
return;
}
//候选节点(遍历每个考场)
for (int p = 0; p <= cnt; p++)//遍历每个考场
{
if (check(p, now))///判断编号为now这个人是否于q[i]考场里面的人认识
{
q[p].push_back(now);//如果now于q[i]考场的人都不认识,就now先进该考场
dfs(now + 1, cnt);//判断完,编号+1,判断下一个人,考场数不变
q[p].pop_back();//回溯
}
}
//增加新的考场
if (cnt < n)
{
q[cnt + 1].push_back(now);
dfs(now + 1, cnt+1);//dfs,判断完,编号+1,判断下一个人,考场数+1
q[cnt+1].pop_back();//回溯
}
}
int main()
{
cin >> n >> m;
while (m--)
{
int a, b;
cin >> a >> b;
g[a][b] = 1;
g[b][a] = 1;
}
dfs(1, 0);
cout << ans + 1;
return 0;
}
over~有用就点个赞呗~