问题描述
  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
 
代码:
 
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
#define inf 0x3f3f3f3f
using namespace std;

int n,m;
bool gvis[101];
int g[101];
int u[10001],v[10001],first[10001],nex[10001];
int ans;
bool check(int k,int gi) {
    int kk = first[k];
    while(kk != -1) {
        if(g[v[kk]] == gi) return false;
        kk = nex[kk];
    }
    return true;
}
void dfs(int k,int num) {
    if(num >= ans) return;
    if(k > n) {
        ans = num;
        return;
    }
    for(int i = 1;i <= num + 1;i ++) {
        if(!gvis[i]) {
            gvis[i] = true;
            g[k] = i;
            dfs(k + 1,num + 1);
            g[k] = 0;
            gvis[i] = false;
        }
        else if(check(k,i)) {
            g[k] = i;
            dfs(k + 1,num);
            g[k] = 0;
        }
    }
}
int main() {
    scanf("%d%d",&n,&m);
    memset(first,-1,sizeof(first));
    ans = n;
    for(int i = 0;i < m;i ++) {
        scanf("%d%d",&u[i],&v[i]);
        nex[i] = first[u[i]];
        first[u[i]] = i;
        u[i + m] = v[i];
        v[i + m] = u[i];
        nex[i + m] = first[u[i + m]];
        first[u[i + m]] = i + m;
    }
    dfs(1,0);
    printf("%d",ans);
}