UVA11825 Hackers' Crackdown
Posted 2855669158
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA11825 Hackers' Crackdown相关的知识,希望对你有一定的参考价值。
题意:有n台计算机(n<=16),每一台有n个服务,告诉每台电脑相连的电脑,关掉一台电脑的某个的服务也会关掉与他相连的电脑的同一个服务,每台电脑只能选择一个服务关闭,没有电脑运行这个服务,那么这个服务就瘫痪,问最多能使几个服务瘫痪
题解:首先n很小,可以想到是状态压缩,关一个电脑可以关掉与它相连的电脑,那么应该尽量少用电脑使得这些电脑加上相连的电脑的并集是全部电脑,把每一台电脑和其相连的作为一个集合的元素如:n=3,1连2,那么可以用一个数表示二进制是011,设dp[s]代表s最多能形成几个全集,然后就是枚举子集dp
#include <bits/stdc++.h> #define ll long long #define maxn (1<<16)+5 using namespace std; int n, m, t, s[maxn], p[maxn], dp[maxn], num=1; void init(){ for(int i=0;i<(1<<n);i++) for(int j=0;j<n;j++) if(i&(1<<j)) s[i] |= p[j]; } int main(){ while(~scanf("%d", &n)&&n){ memset(dp, 0, sizeof(dp)); memset(p, 0, sizeof(p)); memset(s, 0, sizeof(s)); for(int i=0;i<n;i++){ scanf("%d", &m); p[i] = 1<<i; while(m--) scanf("%d", &t),p[i] |= (1<<t); } init(); int all = (1<<n)-1; for(int i=0;i<(1<<n);i++){ for(int j=i;j;j=(j-1)&i) if(s[j] == all) dp[i] = max(dp[i], dp[i^j]+1); } printf("Case %d: %d\n", num++, dp[all]); } return 0; }
以上是关于UVA11825 Hackers' Crackdown的主要内容,如果未能解决你的问题,请参考以下文章
UVA - 11825 —— Hackers' Crackdown
Hackers' Crackdown UVA - 11825
UVA 11825 - Hackers' Crackdown 状态压缩 dp 枚举子集