Language: Default It‘s not a Bug, It‘s a Feature!
Description It is a curious fact that consumers buying a new software product generally do not expect the software to be bug-free. Can you imagine buying a car whose steering wheel only turns to the right? Tinyware Inc. is one of those companies. After releasing a new word processing software this summer, they have been producing patches ever since. Only this weekend they have realized a big problem with the patches they released. While all patches fix some bugs, More formally, the situation looks like this. Tinyware has found a total of n bugs B = {b1, b2, ..., bn} in their software. And they have released m patches p1, p2, ..., pm. To apply patch pi to the software, the bugs Bi+ in B have to be present Tinyware‘s problem is a simple one. Given the original version of their software, which contains all the bugs in B, it is possible to apply a sequence of patches to the software which results in a bug- free version of the software? And if so, assuming that Input The input contains several product descriptions. Each description starts with a line containing two integers n and m, the number of bugs and patches, respectively. These values satisfy 1 <= n <= 20 and 1 <= m <= 100. This is followed by m lines describing the The first of these strings describes the bugs that have to be present or absent before the patch can be applied. The i-th position of that string is a ``+‘‘ if bug bi has to be present, a ``-‘‘ if bug bi has to be absent, and a `` 0‘‘ if it doesn‘t matter whether The second string describes which bugs are fixed and introduced by the patch. The i-th position of that string is a ``+‘‘ if bug bi is introduced by the patch, a ``-‘‘ if bug bi is removed by the patch (if it was present), and a ``0‘‘ if bug bi is not affected The input is terminated by a description starting with n = m = 0. This test case should not be processed. Output For each product description first output the number of the product. Then output whether there is a sequence of patches that removes all bugs from a product that has all n bugs. Note that in such a sequence a patch may be used multiple times. If there is such Print a blank line after each test case. Sample Input 3 3 1 000 00- 1 00- 0-+ 2 0-- -++ 4 1 7 0-0+ ---- 0 0 Sample Output Product 1 Fastest sequence takes 8 seconds. Product 2 Bugs cannot be fixed. Source |
这个题拿到手并不会做,没有好的思路,然后就看了网上的题解。第一次碰到不建图也能SPFA的,又学习了。另外这一题的位运算处理也非常巧妙,这是我不熟悉的,先放在这里,以后多来看几遍。
參考这两篇博客,写的非常好:http://www.cnblogs.com/scau20110726/archive/2012/12/16/2820739.html
http://www.cnblogs.com/staginner/archive/2011/10/25/2223489.html
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #pragma comment (linker,"/STACK:102400000,102400000") #define pi acos(-1.0) #define eps 1e-6 #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r #define FRE(i,a,b) for(i = a; i <= b; i++) #define FREE(i,a,b) for(i = a; i >= b; i--) #define FRL(i,a,b) for(i = a; i < b; i++) #define FRLL(i,a,b) for(i = a; i > b; i--) #define mem(t, v) memset ((t) , v, sizeof(t)) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define DBG pf("Hi\n") typedef long long ll; using namespace std; #define INF 0x3f3f3f3f #define mod 1000000009 const int maxn = 25; const int MAXN = 111; const int MAXM = (1<<20)+100; const int N = 1005; char s1[maxn],s2[maxn]; int s[2][MAXN],t[2][MAXN],cost[MAXN]; int dist[MAXM]; bool inq[MAXM]; int n,m; void SPFA() { int i,j; mem(inq,false); mem(dist,INF); queue<int>Q; int start=(1<<n)-1; Q.push(start); inq[start]=true; dist[start]=0; while (!Q.empty()) { int u=Q.front(); Q.pop(); inq[u]=false; for (i=0;i<m;i++) { if ((u|s[1][i])==u&&(u&s[0][i])==u) { int v=u; v|=t[1][i]; v&=t[0][i]; if (dist[v]>dist[u]+cost[i]) { dist[v]=dist[u]+cost[i]; if (!inq[v]) { inq[v]=true; Q.push(v); } } } } } // for(i=0;i<=start;i++) // pf("%d ",dist[i]); // pf("\n"); if (dist[0]==INF) pf("Bugs cannot be fixed.\n"); else pf("Fastest sequence takes %d seconds.\n",dist[0]); } int main() { #ifndef ONLINE_JUDGE freopen("C:/Users/lyf/Desktop/IN.txt","r",stdin); #endif int i,j,cas=0; while (sff(n,m)) { if (n==0&&m==0) break; mem(s,0); mem(t,0); for (i=0;i<m;i++) { scanf("%d%s%s",&cost[i],s1,s2); for (j=0;j<n;j++) { if (s1[j]==‘+‘) s[1][i]+=(1<<j); if (s1[j]!=‘-‘) s[0][i]+=(1<<j); if (s2[j]==‘+‘) t[1][i]+=(1<<j); if (s2[j]!=‘-‘) t[0][i]+=(1<<j); } } pf("Product %d\n",++cas); SPFA(); pf("\n"); } return 0; }
It's not a Bug, It's a Feature! (poj 1482 最短路SPFA+隐式图+位运算)