给你一个一般图 保证每条边的一端下标不大于30 问最小覆盖集的大小为多少
爆搜:枚举前30个点是否在覆盖集内
剪枝1:如果不在的话 那么他所连的下标大于30的点都必须选
剪纸2:最优解剪枝
#include<bits/stdc++.h> using namespace std; int n, m; bitset<550> G[550], em; int cnt, ans; void dfs(int o, bitset<550> a) { if (a.count() >= ans) { return; } if (o == n + 1 || o > 30) { ans = min(ans, (int)a.count()); return; } if (a[o] == 1) { dfs(o + 1, a); return; } a[o] = 1; dfs(o + 1, a); a[o] = 0; a |= G[o]; dfs(o + 1, a); } int main() { while (scanf("%d %d", &n, &m) != -1) { ans = 30; for (int i = 1; i <= n; i++) { G[i].reset(); } for (int i = 0, u, v; i < m; i++) { scanf("%d %d", &u, &v); G[u][v] = G[v][u] = 1; } dfs(1, em); printf("%d ", ans); } }