UVA - 11825 Hackers' Crackdown

原创 2013年12月05日 12:28:26

题意: 假设你是一个黑客,入侵了一个有着n台计算机的网络(0,1,...n-1),一共有n种服务

每台计算机都运行着所有的业务,对于每台计算机,你都可以选择一项服务,终止这台计算机和所有与它相连的计算机的该业务,你的目标是让尽量多的服务完全瘫痪(没有计算机运行该业务),输出完全瘫痪的服务的最大数量

思路:本题的数学模型是:将n个集合P1,P2,...Pn分成尽量多组,使的每组中所有集合的并集等于全集,这里的集合Pi是计算机i及其相邻的计算机的集合,每组对应于题目中的一项服务,分的组越多那么就代表能破坏的服务越多

用cover(S)表示若干Pi的集合S中所有Pi的并集,状态转移方程是:

f(s) = max(f(S-S0)|S0是S的子集,cover[S0] = 全集) + 1

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1<<17+10;

int p[MAXN],cover[MAXN],dp[MAXN];
int n;

int main(){
    int cas = 1;
    while (scanf("%d",&n) != EOF && n){
        for (int i = 0; i < n; i++){
            p[i] = 1<<i;
            int m;
            scanf("%d",&m);
            while (m--){
                int x;
                scanf("%d",&x);
                p[i] |= (1<<x);
            }
        }
        for (int i = 0; i < (1<<n); i++){
            cover[i] = 0;
            for (int j = 0; j < n; j++)
                if (i & (1<<j))
                    cover[i] |= p[j];
        }
        dp[0] = 0;
        int full = (1<<n) - 1;
        for (int i = 1; i <= full; i++){
            dp[i] = 0;
            for (int j = i; j; j = (j-1)&i)
                if (cover[j] == full)
                    dp[i] = max(dp[i],dp[i^j]+1);
        }
        printf("Case %d: %d\n",cas++,dp[full]);
    }
    return 0;
}


UVA 11825 Hackers' Crackdown(状压dp)

题意: n
  • lwt36
  • lwt36
  • 2015年11月12日 17:44
  • 204

Uva 11825 - Hackers' Crackdown 状态压缩

Problem H Hackers’ Crackdown  Input: Standard Input Output: Standard Output   Miracle Corpora...
  • cyendra
  • cyendra
  • 2013年06月03日 10:42
  • 628

uva11825 Hackers' Crackdown

Problem H Hackers’ Crackdown  Input: Standard Input Output: Standard Output   Miracle Corpora...

UVA 11825 Hackers' Crackdown(状压DP)

这道题的题意就是有n个点,每个点都有邻居,问你依靠这些关系,一共可以组成几个完整的网络 思路 这道题因为数据最大才16,所以可以用状态压缩去做,0代表不经过,1代表经过。这样枚举肯定不会超时的,然...

UVa 11825 Hackers' Crackdown(二进制压缩+DP)

本题课抽象成给出一些集合,求最多能有多少组集合,使每组的并集是全集。这里面每个集合就是每个点以及和他们邻近的点。 点最多有16个所以想到用2进制压缩。 首先在输入时用二进制记录下每个节点及邻接的节...

UVA 11825 Hackers' Crackdown(状态压缩DP)

题目链接: code: //Must so #include #include #include #include #define mem(a,x) memset(a,x,sizeof(a...

Hacker's Crackdown(UVa 11825)状态压缩dp+数学模型

来自《算法竞赛入门经典训练指南》 1.题目原文 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page...

uva 11825 ,Hacker's Crackdown 状态压缩 dp

// uva 11825 Hacker's Crackdown // // 题目意思看了很久才看懂,有n台计算机,有n种服务,每台计算机上运行所有 // 的服务,并且其中有的计算机与某些计算机相互邻接...

UVa 11825 Hackers’ Crackdown

参照大白书上面的解法,总共三个步骤,前两个步骤都较好理解。P[i]是用位表示的当选中i时,总共有0~n-1总共有多少个数字被覆盖。cover[S]则表示,当子集为S时,0~n-1中能够被覆盖的位数。若...

UVA 11825(Hacker's Crackdown-集合)

给一个集合U和一堆子集 最多把子集分成多少份,使每份的并为全集U?集合子集的遍历 for(int S0 = S; S0; S0 = (S0-1)&S)#include using namespac...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA - 11825 Hackers' Crackdown
举报原因:
原因补充:

(最多只允许输入30个字)