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
- UVa 658 It's not a Bug, it's a Feature! (Dijkstra+位运算技巧+好题)
- UVa 658 It's not a Bug, it's a Feature! 位运算技巧+dijkstra优先队列优化
- 【UVA】658 - It's not a Bug, it's a Feature!(隐式图 + 位运算)
- UVa 658 - It's not a Bug, it's a Feature!(Dijkstra算法)
- UVA 658 - It's not a Bug, it's a Feature!(dijkstra+优先队列)
- uva 658 - It's not a Bug, it's a Feature!(优先队列Dijkstra)
- UVA - 658 It’s not a Bug, it’s a Feature!(优先队列Dijkstra)
- UVa 658It's not a Bug, it's a Feature! -- 最短路dijkstra
- 658 - It's not a Bug, it's a Feature! (Dijkstra算法)
- It's not a Bug, it's a Feature! UVA
- It's not a Bug, it's a Feature! UVA
- It's not a Bug, it's a Feature! UVA
- It's not a Bug, it's a Feature! UVA
- (beginer) 最短路 UVA 658 It\'s not a Bug, it\'s a Feature!
- UVA 658 It's not a Bug, it's a Feature!(状压+隐式图+最短路)
- hdu 1818 It's not a Bug, It's a Feature!(位运算+bfs优先队列)
- 658 - It's not a Bug, it's a Feature!
- 658 - It's not a Bug, it's a Feature!-----------优先队列和spfa----做了很长时间!!!(好题!)
- 动态规划 基础总结
- Android table布局开发的一个简单的计算器
- 倒输一个整数(递归调用)
- 前端优化十四原则
- dedecms后台验证码显示不正常的四种处理办法
- UVa 658 It's not a Bug, it's a Feature! (Dijkstra+位运算技巧+好题)
- 如何坚持每周写一篇博客
- (7) linux 编译并安装mysql-5.6.15.tar.gz ---> CentOS-6.6-x86_64 + mysql-5.6.15.tar.gz
- quartz CronExpression表达式
- 第二篇T语言实例开发(版本5.3),福彩3D摇号器
- POJ 2524 Ubiquitous Religions 详细题解(并查集)
- Cocos2d-x学习笔记(一)——开发环境搭建(win7)
- 开发中遇到的一个关于 SQL 语句执行的问题
- 关于dede:list 标签 titlelen 长度显示不全解决方案