https://www.luogu.org/problemnew/show/P2761
跟网络流没有半毛钱关系,压位后跑迪杰斯特拉就ok了。注意位运算的优先级:
&
>
∣
\& > |
&>∣,多加括号就避免了,很难调是哪错了,因为根本想不到这里错。
#include<bits/stdc++.h>
using namespace std;
#define maxn (1<<21)
#define INF 0x3f3f3f3f
struct Edge{
int from,to,dist;
};
struct HeapNode{
int u,d;
bool operator < (const HeapNode& x)const{
return d>x.d;
}
};
int n,m;
int t[106],b1[105],b2[105],f1[105],f2[105];
bool done[maxn];
int d[maxn];
int all_bits;
void dijkstra()
{
priority_queue<HeapNode> Q;
for(int i=1;i<=all_bits;i++)d[i]=INF;
d[0]=0;
memset(done,0,sizeof(done));
Q.push((HeapNode){0,0});
while(!Q.empty())
{
HeapNode x=Q.top();
Q.pop();
int u=x.u;
if(done[u])continue;
done[u]=1;
for(int i=1;i<=m;i++)
{
if((u&b1[i])==0 && (u&b2[i])==b2[i])
{
int v=((u|f1[i])&(all_bits^f2[i]));
if(d[v]>d[u]+t[i])
{
d[v]=d[u]+t[i];
Q.push((HeapNode){v,d[v]});
}
}
}
}
}
int main()
{
//freopen("input.in","r",stdin);
cin>>n>>m;
all_bits=(1<<n)-1;
for(int i=1;i<=m;i++)
{
char s[30];
scanf("%d",&t[i]);
scanf("%s",s);
for(int j=0;j<n;j++)
if(s[j]=='+')b1[i]^=(1<<j);
else if(s[j]=='-')b2[i]^=(1<<j);
scanf("%s",s);
for(int j=0;j<n;j++)
if(s[j]=='-')f1[i]^=(1<<j);
else if(s[j]=='+')f2[i]^=(1<<j);
}
dijkstra();
cout<<(d[all_bits]==INF?0:d[all_bits])<<endl;
return 0;
}