1. 程式人生 > >第十五屆四川省省賽 SCU - 4439 Vertex Cover

第十五屆四川省省賽 SCU - 4439 Vertex Cover

給你一個一般圖 保證每條邊的一端下標不大於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\n", ans); } }
View Code