第十五屆四川省省賽 SCU - 4439 Vertex Cover
阿新 • • 發佈:2018-11-04
給你一個一般圖 保證每條邊的一端下標不大於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; }View Codeif (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\n", ans); } }