|
|
|
@ -0,0 +1,42 @@
|
|
|
|
|
#include <bits/stdc++.h>
|
|
|
|
|
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;
|
|
|
|
|
}
|