第十五届四川省省赛 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

猜你喜欢

转载自www.cnblogs.com/Aragaki/p/9905601.html