回溯
#include <iostream>using namespace std;
const int N = 110;
int n, m;
bool a[N][N]; //关系
int p[N][N]; //第N个考场的第几个座位坐的是谁
int minRoom = N;void dfs(int person, int roomCount){if(roomCount >= minRoom) return;if(person > n){minRoom = min(minRoom, roomCount);return;}for(int i = 1; i <= roomCount; i++){int seat = 1;while(p[i][seat] && !a[person][p[i][seat]]){seat++;}if(!p[i][seat]){p[i][seat] = person;dfs(person + 1, roomCount);p[i][seat] = 0;}}p[roomCount+1][1] = person;dfs(person+1, roomCount+1);p[roomCount+1][1] = 0;
};int main()
{cin >> n >> m;for(int i = 0; i < m; i++){int p1, p2;scanf("%d%d", &p1, &p2);a[p1][p2] = a[p2][p1] = true;}dfs(1, 1);cout << minRoom;return 0;
}