问题 1874: [蓝桥杯][2017年第八届真题]分考场
时间限制: 1Sec 内存限制: 128MB 提交: 361 解决: 92
题目描述
n个人参加某项特殊考试。
为了公平,要求任何两个认识的人不能分在同一个考场。
求是少需要分几个考场才能满足条件。
输入
第一行,一个整数n(1<n<100),表示参加考试的人数。
第二行,一个整数m,表示接下来有m行数据
以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n) 表示第a个人与第b个人认识。
输出
一行一个整数,表示最少分几个考场。
样例输入
5 8 1 2 1 3 1 4 2 3 2 4 2 5 3 4 4 5
样例输出
4
提示
无
思路:从第一个人开始枚举,不断往下搜索。
代码:
#include<iostream>
#include<algorithm>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
#include<string.h>
#include<queue>
#include<stack>
#include<cstdio>
using namespace std;
const int maxn=100+6;
#define mod 1000000007
#define INF 0x3f3f3f3f
int e[maxn][maxn];
int ans;
int cnt[maxn];//记录教室内多少人
int pe[maxn][maxn];//记录教室内都有谁
int n;
void dfs(int x,int num)
{
if(num>=ans)
return;
if(x>n)
{
ans=min(ans,num);
return ;
}
rep(i,1,num) //对应第i个教室来说
{
int len=cnt[i];
int flag=0;//看有没有认识的人
rep(j,1,len)
{
if(e[x][pe[i][j]])
{
flag=1;
break;
}
}
if(!flag)
{
pe[i][++cnt[i]]=x;
dfs(x+1,num);
cnt[i]--;
}
}
pe[num+1][++cnt[num+1]]=x;
dfs(x+1,num+1);
cnt[num+1]--;
}
int main()
{
int m;
cin>>n>>m;
while(m--)
{
int a,b;
cin>>a>>b;
e[a][b]=1;
e[b][a]=1;
}
ans=INF;
dfs(1,0);
cout<<ans<<endl;
}