//.....无向图...两条边都要加入....掉了两次坑了.....还有 剪枝的时候,==也要考虑到,不能只考虑到大于的情况....会超时
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #include <stack> #include <vector> #include <queue> #define ll long long #define INF 0x3f3f3f3f using namespace std; const int N = 110; int graph[N][N];//存储两个同学的关系 vector<int> Room[N];//N个考场 int n, m, cnt = 0, numr = N, nump = 0; void dfs(int a, int num) { if(num >= numr){ return; } if(a == n+1){ // cout << a << " " << num <<endl; numr = num; // cout << " " << numr <<endl; return; } //在已存在的考场里找合适的位置 for(int i=0; i<num; i++){//第i+1个考场 bool flag = true; for(vector<int>::iterator it = Room[i].begin(); it != Room[i].end(); it++){ int p = *it; if(graph[a][p]){//认识,标记 flag = false; } } if(flag){//未被标记 Room[i].push_back(a); //进入这个教室 dfs(a+1, num);//安排下一个同学 Room[i].pop_back();//弹出刚加入的同学 } } //重新找一个考场 Room[num].push_back(a); dfs(a+1, num+1); Room[num].pop_back(); } int main() { cin >> n >> m; memset(graph, 0, sizeof(graph)); for(int i=0; i<m; i++){ int a, b; cin >> a >> b; graph[a][b] = 1; graph[b][a] = 1; } dfs(1, 0);//从第一个学生开始 cout << numr << endl; return 0; }