洛谷传送门
LOJ传送门
解析:
这道题与网络流什么关系都没有。都没有。。都没有。。。
那它为什么在网络流24题里面啊?!!!!
思路:
我真的是一脸懵逼,我连最短路做法都想出来了还是没有想出来网络流怎么做,然而网上也并没有找到网络流做法,如果正在读这篇博客的您有思路或者看到过这道题的网络流做法,欢迎告知博主。
那么就直接最短路一阵乱搞过去吧。
注意不要试图建边,一不小心就很可能MLEMLEMLE,毕竟这是一个有点大而且复杂的图。
直接在跑最短路的时候枚举每一个补丁跑最短路就行了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const
cs int N=(1<<20)+9;
int b1[101],b2[101];
int f1[101],f2[101];
int w[101];
int dist[N];
bool vis[N];
set<pair<int,int> > q;
int n,m;
inline void dijkstra(){
memset(dist,0x3f,sizeof dist);
dist[(1<<n)-1]=0;
q.insert(make_pair(0,(1<<n)-1));
while(!q.empty()){
int u=q.begin()->second;
q.erase(q.begin());
if(vis[u])continue;
vis[u]=true;
for(int re i=1;i<=m;++i){
if((u&b1[i])==b1[i]&&(u&b2[i])==0){
int to=f1[i]&u;
to=u^to;
to|=f2[i];
if(dist[to]>dist[u]+w[i]){
q.erase(make_pair(dist[to],to));
dist[to]=dist[u]+w[i];
q.insert(make_pair(dist[to],to));
}
}
}
}
}
char s[100];
signed main(){
scanf("%d%d",&n,&m);
for(int re i=1;i<=m;++i){
scanf("%d",&w[i]);
scanf("%s",s);
for(int re j=0;j<n;++j){
switch(s[j]){
case '-':{
b2[i]|=1<<j;
break;
}
case '+':{
b1[i]|=1<<j;
break;
}
}
}
scanf("%s",s);
for(int re j=0;j<n;++j){
switch(s[j]){
case '-':{
f1[i]|=1<<j;
break;
}
case '+':{
f2[i]|=1<<j;
break;
}
}
}
}
dijkstra();
printf("%d",dist[0]==0x3f3f3f3f?0:dist[0]);
return 0;
}