其实和网络流没啥关系。
按状态用二进制跑spfa。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1<<21; 4 int v[N],d[N],t[N],n,m; 5 struct node{ 6 int b1,b2,f1,f2; 7 }a[105]; 8 char s[25]; 9 queue<int>q; 10 void spfa(int tmp) 11 { 12 memset(d,0x3f,sizeof(d)); 13 memset(v,0,sizeof(v)); 14 d[tmp]=0;v[tmp]=1; 15 q.push(tmp);int inf=d[0]; 16 while(!q.empty()) 17 { 18 int x=q.front();v[x]=0;q.pop(); 19 for(int i=1;i<=m;++i) 20 { 21 if(a[i].b2&x)continue; 22 if((a[i].b1&x)!=a[i].b1)continue; 23 int y=x^(x&a[i].f1)|a[i].f2; 24 if(d[x]+t[i]<d[y]) 25 { 26 d[y]=d[x]+t[i]; 27 if(!v[y])q.push(y),v[y]=1; 28 } 29 } 30 } 31 if(d[0]==inf)puts("0"); 32 else printf("%d ",d[0]); 33 return; 34 } 35 int main() 36 { 37 scanf("%d%d",&n,&m); 38 for(int i=1;i<=m;++i) 39 { 40 scanf("%d",&t[i]); 41 scanf("%s",s); 42 for(int j=0;j<n;++j) 43 { 44 if(s[j]=='+')a[i].b1|=(1<<j); 45 if(s[j]=='-')a[i].b2|=(1<<j); 46 } 47 scanf("%s",s); 48 for(int j=0;j<n;++j) 49 { 50 if(s[j]=='+')a[i].f2|=(1<<j); 51 if(s[j]=='-')a[i].f1|=(1<<j); 52 } 53 } 54 spfa((1<<n)-1); 55 return 0; 56 }