网络流24题-3 软件补丁问题

 题目链接:https://www.luogu.com.cn/problem/P2761

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int N=2e6+11;
 5 const ll inf=9999999999999;
 6 int n,m,st,ed,tot=0;
 7 int b[3][N],f[3][N],val[N];
 8 ll dis[N];
 9 char p[N],q[N];
10 bool vis[N];
11 
12 inline int re_ad() {
13     char ch=getchar(); int x=0,f=1;
14     while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
15     while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
16     return x*f;
17 }
18 
19 inline void SPFA() {
20     memset(vis,false,sizeof(vis));
21     for(int i=0;i<=(1<<n);++i) dis[i]=inf;
22     queue<int> q;
23     dis[st]=0,vis[st]=true,q.push(st);
24     while(!q.empty()) {
25         int u=q.front(),v;
26 //        if(dis[u]==7) printf("qwq\n");
27 //        printf("%d: %d%d%d: %d\n",u,(u>>2)&1,(u>>1)&1,u&1,dis[u]);
28         vis[u]=false; q.pop();
29         for(int i=1;i<=m;++i) { 
30             if((b[1][i]&u)<b[1][i]) continue;
31             if(b[2][i]&u) continue;
32             v=(u&(~f[1][i]))|f[2][i];
33 //            if(dis[u]==7) printf("awa %d %d %lld %lld %d\n",u,v,dis[u],dis[v],val[i]);
34 //            printf("%d %d %d: %d\n",u,f[1][i],f[2][i],v);
35             if(dis[u]+1ll*val[i]<dis[v]) {
36 //                printf("dis %d %d %d: %lld %d %lld\n",u,v,i,dis[u],val[i],dis[v]);
37                 dis[v]=dis[u]+1ll*val[i];
38 //                if(dis[v]==7) printf("%d %d\n",v,vis[v]);
39                 if(!vis[v]) vis[v]=true,q.push(v);
40             }
41         }
42     }
43     printf("%lld\n",dis[ed]==inf?0:dis[ed]);
44 }
45 
46 inline void print_test() {
47     for(int i=1;i<=m;++i) printf("%d ",val[i]); puts("");
48     for(int i=1;i<=m;++i) printf("%d ",b[1][i]); puts("");
49     for(int i=1;i<=m;++i) printf("%d ",b[2][i]); puts("");
50     for(int i=1;i<=m;++i) printf("%d ",f[1][i]); puts("");
51     for(int i=1;i<=m;++i) printf("%d ",f[2][i]); puts("");
52 }
53 
54 int main()
55 {
56     n=re_ad(),m=re_ad();
57     st=(1<<n)-1,ed=0;
58     for(int i=1;i<=m;++i) {
59         scanf("%d%s%s",&val[i],p,q);
60         b[1][i]=b[2][i]=f[1][i]=f[2][i]=0;
61         for(int j=0;j<n;++j) {
62             if(p[j]=='+') b[1][i]|=(1<<j);
63             if(p[j]=='-') b[2][i]|=(1<<j);
64             if(q[j]=='+') f[2][i]|=(1<<j);
65             if(q[j]=='-') f[1][i]|=(1<<j);
66         }
67     }
68 //    print_test();
69     SPFA();
70     return 0;
71 }

 

posted @ 2021-08-17 15:02  上官书房  阅读(32)  评论(0)    收藏  举报