P2761 软件补丁问题

P2761 软件补丁问题


二进制储存状态+spfa

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int read()
{
    int s=0,f=1;
    char in=getchar();
    while(in<'0'||in>'9')
    {
        if(in=='-')
            f=-1;
        in=getchar();
    }
    while(in>='0'&&in<='9')
    {
        s=(s<<1)+(s<<3)+in-'0';
        in=getchar();
    }
    return s*f;
}
int open[101],close[101];
int dis[2048];
bool inque[2048];
queue<int> q;
int main()
{
    int n=read(),m=read();
    int base,data;
    for(int j=1;j<=m;j++)
    {
        base=1;
        for(int i=1;i<=n;i++)
        {
            data=read();
            switch(data)
            {
                case -1:open[j]=(open[j]|base);break;
                case 1:close[j]=(close[j]|base);break;
                default:break;
            }
            base<<=1;
        }
    }
    int begin=0;
    base=1;
    for(int i=1;i<=n;i++)
    {
        begin+=base;
        base<<=1;
    }
    for(int i=0;i<=2048;i++)
        dis[i]=0x7fffffff;
    dis[begin]=0;
    inque[begin]=true;
    q.push(begin);
    int pass;
    int nxt;
    while(!q.empty())
    {
        pass=q.front();
        q.pop();
        inque[pass]=false;
        for(int i=1;i<=m;i++)
        {
            nxt=pass-(pass&close[i]);
            nxt=(nxt|open[i]);
            if(dis[nxt]>dis[pass]+1)
            {
                dis[nxt]=dis[pass]+1;
                if(!inque[nxt])
                {
                    q.push(nxt);
                    inque[nxt]=true;
                }
            }
        }
    }
    if(dis[0]!=0x7fffffff)
        printf("%d",dis[0]);
    else
        printf("-1");;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Lance1ot/p/8858318.html
今日推荐