【网络流24题】软件补丁问题(最短路)
题面
题解
这题貌似和网络流没啥关系
因为错误很少
可以直接状压
然后利用位运算直接跑最短路就行了
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAX 1001
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int b1[MAX],b2[MAX];
int F1[MAX],F2[MAX];
char ch[50];
int t[MAX];
int dis[1<<20];
bool vis[1<<20];
queue Q;
int n,m;
int main()
{
freopen("bugs.in","r",stdin);
freopen("bugs.out","w",stdout);
n=read();m=read();
for(int i=1;i<=m;++i)
{
t[i]=read();
scanf("%s",ch);
for(int j=0;j
{
if(ch[j]=='+')b1[i]|=1<
if(ch[j]=='-')b2[i]|=1<
}
scanf("%s",ch);
for(int j=0;j
{
if(ch[j]=='-')F1[i]|=1<
if(ch[j]=='+')F2[i]|=1<
}
}
memset(dis,63,sizeof(dis));
int INF=dis[0];
dis[(1<
Q.push((1<
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=1;i<=m;++i)
{
if(((u&b1[i])^b1[i])||(u&b2[i]))continue;
int v=(u^(u&F1[i]))|F2[i];
if(dis[v]>dis[u]+t[i])
{
dis[v]=dis[u]+t[i];
if(!vis[v])
{
vis[v]=true;
Q.push(v);
}
}
}
vis[u]=false;
}
printf("%d
",dis[0]==INF?-1:dis[0]);
return 0;
}