#include using namespace std; const int N = 110; int n, m, ans, st[N]; int a[N][N]; bool check(int u) { for (int i = 1; i < u; i++) if (st[i] && a[u][i]) return false; return true; } void dfs(int u, int sum) { // 第u号钻石,之前一共选了sum个钻石 if (u == n + 1) { // 如果所有钻石都找完了 ans = max(ans, sum); // 取最大值 return; } // 如果剩下的钻石都选也没有已有的最好情况多,返回,剪枝 // if (ans > sum + (n - u + 1)) return; if (check(u)) { // 当前钻石与已选钻石没有冲突 st[u] = 1; // 选之 dfs(u + 1, sum + 1); // 继续下一个钻石 st[u] = 0; // 不选 } dfs(u + 1, sum); // 继续下一个钻石 } int main() { cin >> n >> m; while (m--) { int x, y; cin >> x >> y; a[x][y] = a[y][x] = 1; // x<->y互相冲突 } dfs(1, 0); // 从第一个钻石开始选,目前已选0个 cout << ans << endl; return 0; }