UVa 658 It's not a Bug, it's a Feature! (Dijkstra+位运算技巧+好题)

来源:互联网 发布:看澳洲股市软件 编辑:程序博客网 时间:2024/05/22 10:35
/*题意:这个题意都是很长很烦的。首先给出n和m,表示有n个bug和m个补丁。一开始存在n个bug,用1表示一个bug存在0表示不存在,所以一开始就是n个1,我们的目的是要消除所有的bug,所以目标状态就是n个0。对于每个补丁,会给出使用这个补丁的时间,另外会给出两个长度为n的字符串,第一个字符串表示这个补丁适用于什么情况下的bug,第二个字符串表示使用完这个补丁后原来的bug会变成怎么样。先说第一个字符串,s[i]='0',表示第i个bug存在与否都无所谓;s[i]='+',表示第i个bug一定要存在;s[i]='-',表示第i个bug必须不存在;能不能使用这个补丁,就要看当前bug的状态是不是能不能全部满足第一个字符串,能的话就可以使用。第二个字符串表示使用完后的情况,ss[i]='0',表示第i个bug保持不变,原来是1就1是0就0;ss[i]='+',表示第i个bug必须为1;ss[i]='-',表示第i个bug必须为0。最终题目要求解的就是消除所有的bug并且用时最短,输出最短时间,如果bug不可能被完全消除那么就输出失败位运算技巧:①判定某些位置是否为1,如判定2、4位置为1,则转化为判断x|0101是否等于x。②判定某些位置是否为0,如判定2、4位置为0,则转化为判断x&1010是否等于x。③将某些位置转化为1,如2、4位置转化为1,则令x=x|0101。④将某些位置转化为0,如2、4位置转化为0,则令x=x&1010。*/#include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<climits>#include<queue>#include<vector>#include<set>#include<map>#include<cstring>#include<string>using namespace std;int n,m;const int INF=100000000;const int maxn=20+5;const int maxm=100+5;char s1[maxn],s2[maxn];int post1[maxm],post2[maxm],negt1[maxm],negt2[maxm],times[maxm];typedef pair<int,int> P;int d[1<<maxn];void change(char *c1,char *c2,int num){for(int i=0;i<n;i++){if(c1[i]=='+')post1[num]=post1[num]|(1<<i);if(c1[i]!='-')negt1[num]=negt1[num]|(1<<i);}for(int i=0;i<n;i++){if(c2[i]=='+')post2[num]=post2[num]|(1<<i);if(c2[i]!='-')negt2[num]=negt2[num]|(1<<i);}}void dijkstra(){priority_queue<P,vector<P>,greater<P> > que;fill(d,d+(1<<n),INF);int s=(1<<n)-1;d[s]=0;que.push(P(0,s));while(!que.empty()){P p=que.top();que.pop();int v=p.second;if(d[v]<p.first)continue;if(v==0)break;for(int i=0;i<m;i++){if(((v|post1[i])==v)&&((v&negt1[i])==v)){int next=v;next=next|post2[i];next=next&negt2[i];if(d[next]>d[v]+times[i]){d[next]=d[v]+times[i];que.push(P(d[next],next));}}}}}int main(){int t=1;while(~scanf("%d%d",&n,&m)){if(n==0&&m==0)break;memset(post1,0,sizeof(post1));memset(post2,0,sizeof(post2));memset(negt1,0,sizeof(negt1));memset(negt2,0,sizeof(negt2));for(int i=0;i<m;i++){scanf("%d %s %s",×[i],s1,s2);change(s1,s2,i);}dijkstra();printf("Product %d\n",t++);if(d[0]==INF)printf("Bugs cannot be fixed.\n\n");else printf("Fastest sequence takes %d seconds.\n\n",d[0]);}return 0;}

0 0
原创粉丝点击