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

/*
题意:
	这个题意都是很长很烦的。首先给出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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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 P;
int d[1<,greater

> que; fill(d,d+(1<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


你可能感兴趣的:(图论,uva,dijkstra,最短路)