【网络流24题】软件补丁问题(最短路)
题面
题解
这题貌似和网络流没啥关系
因为错误很少
可以直接状压
然后利用位运算直接跑最短路就行了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 1001
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||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<int> 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<n;++j)
{
if(ch[j]=='+')b1[i]|=1<<j;
if(ch[j]=='-')b2[i]|=1<<j;
}
scanf("%s",ch);
for(int j=0;j<n;++j)
{
if(ch[j]=='-')F1[i]|=1<<j;
if(ch[j]=='+')F2[i]|=1<<j;
}
}
memset(dis,63,sizeof(dis));
int INF=dis[0];
dis[(1<<n)-1]=0;vis[(1<<n)-1]=1;
Q.push((1<<n)-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\n",dis[0]==INF?-1:dis[0]);
return 0;
}