记录编号 |
152298 |
评测结果 |
AAAAAAAA |
题目名称 |
软件补丁 |
最终得分 |
100 |
用户昵称 |
arksandom |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.018 s |
提交时间 |
2015-03-13 22:56:39 |
内存使用 |
5.32 MiB |
显示代码纯文本
/*网络流24_4 软件补丁*/
/*并不是网络流的做法————队列Bellmanford*/
#include<bits/stdc++.h>
using namespace std;
#define INF 500000000
const int maxn=(1<<20)-1 + 1000;
int d[maxn],p[150];
bool inq[maxn];
string from[150],to[150];
int BellmanFord(int s,int n,int m)
{
memset(inq,false,sizeof(inq));
for(int i=0;i<=s;i++)d[i]=INF;
d[s]=0;
inq[s]=true;
queue<int> Q;
Q.push(s);
while(!Q.empty()){
bool flag=1;
int i=Q.front(); Q.pop();
inq[i]=false;
for(int j=0;j<m;j++){
int x=i,tmp=0;
for(int k=n-1;k>=0;k--){
if((from[j][k]=='+'&& x%2==0)||(from[j][k]=='-'&& x%2==1)){
flag=0;
break;
}
tmp=tmp<<1;
if(to[j][k]=='0')tmp+=x%2; //不变
else if(to[j][k]=='+')tmp+=1;
x=x>>1;
}
if(flag){
//cout<<"tmp="<<tmp<<endl;
int tmp2=0;
for(int k=0;k<n;k++){
tmp2=tmp2<<1;
tmp2+=tmp%2;
tmp=tmp>>1;
}
//cout<<tmp2<<endl;
if(d[tmp2]>d[i]+p[j]){
d[tmp2]=d[i]+p[j];
if(!inq[tmp2]){
Q.push(tmp2);
inq[tmp2]=true;
}
}
}
flag=1;
}
}
if(d[0]==INF) return -1;
else return d[0];
}
int main()
{
freopen("bugs.in","r",stdin);
freopen("bugs.out","w",stdout);
//freopen("test.in","r",stdin);
int m,n,s;
cin>>n>>m;
s=(1<<n)-1;
for(int i=0;i<m;i++){
cin>>p[i]>>from[i]>>to[i];
}
cout<<BellmanFord(s,n,m)<<endl;
return 0;
}