【题意及思路】:就是为了防作弊,考场不能有互相认识的人,所以认识的都要分开(残忍了点)。
题目数据量比较小,就是能不能进这个考场的问题,所以dfs跑一跑应该没有太大的问题。T_T!
问题描述
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
样例输入
5
10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
样例输出
5
ac代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[105][105],r[105][105];
int ro[105],ans,n;
void dfs(int x,int num){
if(num>=ans) return;
if(x==n+1)
{
ans=min(ans,num);
return;
}
int i,j,k,cot;
for( i=1;i<=num;i++)
{
k=ro[i];
cot=0;
for( j=1;j<=k;j++)
{
if(f[x][r[i][j]]==0) ++cot;
else break;
}
if(cot==k){
r[i][++ro[i]]=x;//考场能放(人互相不认识)就放进去
dfs(x+1,num);
--ro[i];
}
}
r[num+1][++ro[num+1]]=x;//如果前面的考场都放不进这个人,新开一个房间
dfs(x+1,num+1);
ro[num+1]--;
}
int main()
{
int j,i,m;
// memset(f,0,sizeof(f));
memset(r,0,sizeof(r));
memset(ro,0,sizeof(ro));
scanf("%d%d",&n,&m);
int x,y;
while(m--){
scanf("%d%d",&x,&y);
f[x][y]=f[y][x]=1;
}
ans=0x3f3f3f;
dfs(1,0);
printf("%d\n",ans);
return 0;
}