首页 > 代码库 > [题解]UVA658 It's not a Bug, it's a Feature!
[题解]UVA658 It's not a Bug, it's a Feature!
链接:http://vjudge.net/problem/viewProblem.action?id=22169
描述:有n个漏洞,m个修复漏洞的方法,每种方法耗时不一样,求修复漏洞的最短时间。每种方法的使用对当前漏洞分布的状态有要求,符合要求才能修复,并有可能引入新漏洞。
思路:单源点最短路
这道题卡了我很久,因为不知道怎么表示状态。最开始受到‘0‘的影响,觉得必须要三进制,于是写得很麻烦还错了。之后觉得可以用二进制分别存储‘+‘和‘-‘的状态。我定义两个数组,Condition[i][0]表示第i个方法‘+‘要满足的条件,Condition[i][1]表示第i个方法‘-‘要满足的条件;Operate[i][0]和Operate[i][1]同理表示修复手段。
判断当前状态Cur是否可以用第i个方法:(可以自己举个例子推一下)
Cur&Condition[i][0])==Condition[i][0]
((~Cur)&Condition[i][1])==Condition[i][1]
用第i个方法修复漏洞:
Cur|=Operate[i][0];
Cur&=(~Operate[i][1]);
然后的问题就是,状态量太多了,或者说是无效的状态量太多了,怎么解决存储问题呢?这个时候我们就考虑不存边,在搜索的时候按照判断结果走,相当于是动态找状态。然后一个bfs就解决问题了。
我的实现:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 #define MaxM 120 7 #define MaxN 30 8 int Cost[MaxM],Condition[MaxM][5],Operate[MaxM][5]; 9 char s1[MaxN],s2[MaxN];10 bool vis[(1<<20)+20];11 int n,m,ans;12 bool Sol;13 typedef pair<int, int> p;14 struct cmp15 {16 bool operator()(p a,p b)17 {18 return a.first>b.first;19 }20 };21 priority_queue <p, vector<p>, cmp> q;22 inline void Clean()23 {24 memset(Condition,0,sizeof(Condition));25 memset(Operate,0,sizeof(Operate));26 Sol=false;27 memset(vis,false,sizeof(vis));28 while(!q.empty())29 q.pop();30 }31 void Bfs()32 {33 q.push(make_pair(0,(1<<n)-1));34 p u;35 int i,fi,Cur;36 while(!q.empty())37 {38 u=q.top();q.pop();39 fi=u.first;Cur=u.second;40 if(!Cur)41 {42 Sol=true;43 ans=fi;44 return;45 }46 if(vis[Cur])47 continue;48 vis[Cur]=true;49 for(i=1;i<=m;++i)50 {51 Cur=u.second;52 if((Cur&Condition[i][0])==Condition[i][0]&&((~Cur)&Condition[i][1])==Condition[i][1])53 {54 Cur|=Operate[i][0];55 Cur&=(~Operate[i][1]);56 q.push(make_pair(fi+Cost[i],Cur));57 }58 }59 }60 }61 int main()62 {63 int i,j,t;64 for(t=1;;t++)65 {66 Clean();67 scanf("%d%d",&n,&m);68 if(n==0&&m==0)69 break;70 for(i=1;i<=m;++i)71 {72 scanf("%d%s%s",&Cost[i],s1,s2);73 for(j=0;j<n;++j)74 {75 if(s1[j]==‘+‘)76 Condition[i][0]|=(1<<j);77 else if(s1[j]==‘-‘)78 Condition[i][1]|=(1<<j);79 }80 for(j=0;j<n;++j)81 {82 if(s2[j]==‘+‘)83 Operate[i][0]|=(1<<j);84 else if(s2[j]==‘-‘)85 Operate[i][1]|=(1<<j);86 }87 }88 Bfs();89 printf("Product %d\n",t);90 if(Sol)91 printf("Fastest sequence takes %d seconds.\n\n",ans);92 else93 printf("Bugs cannot be fixed.\n\n");94 }95 return 0;96 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。