二进制储存状态+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;
}