描述

错误就是人们所说的Bug。用户在使用软件时总是希望其错误越少越好,最好是没有错误的。但是推出一个没有错误的软件几乎不可能,所以很多软件公司都在疯狂地发放补丁(有时这种补丁甚至是收费的)。T公司就是其中之一。

上个月,T公司推出了一个新的字处理软件,随后发放了一批补丁。最近T公司发现其发放的补丁有致命的问题,那就是一个补丁在排除某些错误的同时,往往会加入另一些错误. 
此字处理软件中只可能出现n个特定的错误,这n个错误是由软件本身决定的。T公司目前共发放了m个补丁,对于每一个补丁, 都有特定的适用环境,某个补丁只有在当前软件中包含某些错误而同时又不包含另一些错误时才可以使用,如果它被使用,它将修复某些错误而同时加入某些错误。另外,使用每个补丁都要耗一定的时间(即补丁程序的运行时间)。

更准确地说明:
设此字处理软件中可能出现的n个错误为集合B={b1,b2,…,bn}中的元素,T公司目前共发放了m个补丁:p1,p2,…,pm。对于每一个补丁pi, 都有特定的适用环境,某个补丁只有在软件中包含某些错误而同时又不包含另一些错误时才可以用,为了说明清楚,设错误集合:Bi+、 Bi-, 当软件包含了Bi+中的所有错误, 而没有包含Bi-中的任何错误时,补丁Pi才可以被使用,否则不能使用,显然 Bi+、Bi-交集为空。补丁pi将修复某些错误而同时加入某些错误,设错误集合Fi-、Fi+,使用过补丁pi之后,Fi-中的任何错误都不会在软件中出现,而软件将包含Fi+中的所有错误, 同样Fi-、Fi+交集为空。另外,使用每个补丁都要耗一定的时间(即补丁程序的运行时间)。

现在T公司的问题很简单,其字处理软件的初始版本不幸地包含了集合B中的全部n个错误, 有没有可能通过使用这些补丁(任意顺序地使用,一个补丁可使用多次), 使此字处理软件成为一个没有错误的软件。如果可能,希望找到总耗时最少的方案。

格式

输入格式

第一行有两个正整数n和m, n表示错误总数,m表示补丁总数,1<=n<=15, 1<=m<=100。接下来m行给出了m个补丁的信息。每行包括一个正整数(表示此补丁程序pi的运行耗时)和两个长度为n的字符串,中间用一个空格符隔开。

第一个字符串,如果第k个字符为’+’,则表示bk属于Bi+, 若为‘-’,则表示bk属于Bi-, 若为‘0’,则bk 既不属于Bi+也不属于Bi-,即软件中是否包含bk不影响补丁pi是否可用。

第二个字符串,如果第k个字符为’+’,则表示bk属于Fi+, 若为‘-’,则表示bk属于Fi-, 若为‘0’,则bk 既不属于Fi+也不属于Fi-,即软件中是否包含bk不会因使用补丁pi而改变。

输出格式

输出一个整数,如果问题有解,输出总耗时,否则输出0。

样例1

样例输入1[复制]

3 3
1 000 00-
1 00- 0-+
2 0-- -++

样例输出1[复制]

8

提示

注意,请按照n最大为15的条件编程;
如果空间占用过多,将提示 答案错误,而不是 运行时错误 或者其他提示。

来源

Vivian Snow
CTSC99 Day1 ProblemB


二进制表示状态,可以转移就连一条边,求最短路

很像白书上那道题,不显式建边应该也可以

注意位运算

//
// main.cpp
// vijos
//
// Created by Candy on 9/29/16.
// Copyright © 2016 Candy. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N=,M=,INF=1e9+; int n,m,p[M],bt[M],bf[M],ft[M],ff[M];
struct edge{
int v,ne,w;
}e[M*(<<N)];
int h[<<N],cnt=;
char s[N+];
inline void ins(int u,int v,int w){
cnt++;
e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
}
void buildGraph(){
for(int i=;i<(<<n);i++)
for(int j=;j<=m;j++){
if((i&bt[j])==bt[j] && (i&bf[j])==)
ins(i,(i&(~ff[j]))|ft[j],p[j]);
}
} struct hn{
int u;int d;
bool operator <(const hn &rhs)const{return d>rhs.d;}
hn(int a=,int b=):u(a),d(b){}
};
int d[<<N]; bool done[<<N];
void dijkstra(int S){
memset(d,,sizeof(d));
priority_queue<hn> q;
q.push(hn(S,));
d[S]=;
while(!q.empty()){
hn x=q.top();q.pop();
int u=x.u;
if(done[u]) continue;
done[u]=;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v,w=e[i].w;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
q.push(hn(v,d[v]));
}
}
}
}
int main(int argc, const char * argv[]) {
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d%s",&p[i],s);
for(int j=;j<n;j++){
if(s[j]=='+') bt[i]|=(<<j);
if(s[j]=='-') bf[i]|=(<<j);
}
scanf("%s",s);
for(int j=;j<n;j++){
if(s[j]=='+') ft[i]|=(<<j);
if(s[j]=='-') ff[i]|=(<<j);
}
}
buildGraph();
dijkstra((<<n)-);
if(d[]>INF) printf("");
else printf("%d",d[]);
return ;
}

Vijos1019 补丁VS错误[最短路 状态压缩]的更多相关文章

  1. POJ 3311 Hie with the Pie (BFS+最短路+状态压缩)

    题意:类似于TSP问题,只是每个点可以走多次,求回到起点的最短距离(起点为点0). 分析:状态压缩,先预处理各点之间的最短路,然后sum[i][buff]表示在i点,状态为buff时所耗时...... ...

  2. Light OJ 1316 A Wedding Party 最短路+状态压缩DP

    题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...

  3. 最短路+状态压缩dp(旅行商问题)hdu-4568-Hunter

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4568 题目大意: 给一个矩阵 n*m (n m<=200),方格里如果是0~9表示通过它时要花 ...

  4. hdu 4114 Disney's FastPass(最短路+状态压缩)

    Disney's FastPass Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. HDU Victor and World (最短路+状态压缩)

    题目链接:传送门 题意: n个城市m条路.刚開始在点1,求把每一个城市都遍历一边最后回到1的花费的最小值. 分析: ​​+n​2​​∗2​n​​). 转自Bestcode. 以下说说我的状态转移,首先 ...

  6. luogu2761 软件补丁问题 状态压缩最短路径

    关键词:状态压缩 最短路径 想不出快速办法,就先考虑考虑暴力.枚举每一种错误分布的情况,然后通过可用的补丁转化为另多种情况,这些情况又转化为更多种情况……我们可以用图来表示这种关系! 状态压缩:每个错 ...

  7. 2010辽宁省赛E(Bellman_Ford最短路,状态压缩DP【三进制】)

    #include<bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;struct node{    int v,z,d, ...

  8. Luogu P4011 孤岛营救问题(状态压缩+最短路)

    P4011 孤岛营救问题 题意 题目描述 \(1944\)年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到 ...

  9. 紫书 例题 11-6 UVa 658 (状态压缩+隐式图搜索+最短路)

    这道题用到了很多知识点, 是一道好题目.      第一用了状态压缩, 因为这里最多只有20位, 所以可以用二进制来储存状态 (要对数据范围敏感), 然后 涉及到了一些位运算.     第二这里是隐式 ...

随机推荐

  1. css通用小笔记03——浏览器窗口变小 div错位的问题

    我最近写网页的时候,经常碰到一个普遍的问题,经过我的查阅和尝试,终于解决了这一问题,这里有两种方法提供给大家,如果博友还有更好的方法,欢迎补充. 一.使用min-width属性: 我们先看看下面这段代 ...

  2. 在 Xamarin.Android 中使用 Notification.Builder 构建通知

    0 背景 在 Android 4.0 以后,系统支持一种更先进的 Notification.Builder 类来发送通知.但 Xamarin 文档含糊其辞,多方搜索无果,遂决定自己摸索. 之前的代码: ...

  3. 浅析字符串操作方法slice、substr、substring及其IE兼容性

    在截取字符串时常常会用到substr().substring().slice()方法,有时混淆之间的用法,故总结下.   slice() 定义:接受一个或者两个参数,第一个参数指定子字符串的开始位置. ...

  4. sap去除后缀0方法

    原贴地址:http://fuhesap.com/SAP/179.html SHIFT str LEFT DELETING LEADING '0'.如果要在layout显示不出前面的0 格式: & ...

  5. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q81-Q83)

    Question  81You are designing a custom administrative timer job for a SharePoint 2010 farm. You need ...

  6. [Android]在Adapter的getView方法中绑定OnClickListener比较好的方法

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4146512.html  给ListView中每个item绑定点 ...

  7. Android studio 使用SVN需要忽略的文件

    Android Studio创建的Android项目一般需要忽略 1..idea文件夹 2..gradle文件夹 3.所有的build文件夹 4.所有的.iml文件 5.local.propertie ...

  8. 三种经典iPhone上网络抓包方法详解

    此文章来自:听云博客 很多时候需要网络抓包分析,在iPhone上抓包稍有不同,下面介绍三种常用的方式.分析工具以wireshark为例. 一.最简单的方式:用PC作为热点,在PC上抓包 优点:简单 缺 ...

  9. 打印完整URL

    if(requestDictionary != nil) { //添加参数,将参数拼接在url后面 NSMutableString *paramsString = [NSMutableString s ...

  10. ios 友盟第三方登录遇到的各种坑。

    //未使用pod的点友盟官方文档 http://dev.umeng.com/social/ios/quick-integration 首先pod导入 pod 'UMengSocialCOM', '~& ...