记录编号 152298 评测结果 AAAAAAAA
题目名称 软件补丁 最终得分 100
用户昵称 Gravatararksandom 是否通过 通过
代码语言 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;
}