Description

m 个补丁程序将原软件修复成一个没有错误的软件,并使修复后的软件耗时最少。

对于给定的 m 个补丁程序,找到总耗时最少的软件修复方案。


Input

第 i 而改变。


Output

将总耗时数输出。如果问题无解,则输出 0


Sample Input

3 3 
1 000 00- 
1 00- 0-+ 
2 0– -++


Sample Output

8

 


 

24题中的最后一个分层图最短路了,注意一下就是有的OJ上题目有误(f1,f2搞反了)


 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<cstring>
 8 using namespace std;
 9 #define maxn 110
10 #define SIZE 2000000
11 #define inf (llg)1e16
12 #define llg long long 
13 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
14 llg n,m,tail,head,dl[SIZE+10],dis[(1<<20)+10],bj[(1<<20)+10];
15 char s[maxn];
16 
17 struct node
18 {
19     llg dis,b1,b2,f1,f2;
20 }a[maxn];
21 
22 void init()
23 {
24     cin>>n>>m;
25     for (llg i=0;i<(1<<n)-1;i++) dis[i]=inf;
26     for (llg i=1;i<=m;i++)
27     {
28         scanf("%lld",&a[i].dis);
29         scanf("%s",s);
30         for (llg k=0;k<n;k++)
31         {
32             if (s[k]=='+') a[i].b1+=(1<<k);
33             if (s[k]=='-') a[i].b2+=(1<<k);
34         }
35         scanf("%s",s);
36         for (llg k=0;k<n;k++)
37         {
38             if (s[k]=='-') a[i].f1+=(1<<k);
39             if (s[k]=='+') a[i].f2+=(1<<k);
40         }
41     }
42     tail=1; head=0; dl[1]=(1<<n)-1;
43 }
44 
45 void spfa()
46 {
47     llg x,v;
48     do
49     {
50         head%=SIZE; head++;
51         x=dl[head]; bj[x]=0;
52         for (llg i=1;i<=m;i++)
53             if (((x|a[i].b1)==x) && ((x&a[i].b2)==0))
54             {
55                 v=x;
56                 for (llg k=0;k<n;k++) if ((v&(1<<k)) && (a[i].f1&(1<<k))) v^=(1<<k);
57                 v|=a[i].f2;
58                 if (dis[v]>dis[x]+a[i].dis)
59                 {
60                     dis[v]=dis[x]+a[i].dis;
61                     if (!bj[v])
62                     {
63                         bj[v]=1;
64                         tail%=SIZE; tail++;
65                         dl[tail]=v;
66                     }
67                 }
68             }
69     }while (head!=tail);
70 }
71 
72 int main()
73 {
74     yyj("a");
75     init();
76     spfa();
77     if (dis[0]==inf) cout<<0;else cout<<dis[0];
78     return 0;
79 }

 

软件补丁问题


Description

m 个补丁程序将原软件修复成一个没有错误的软件,并使修复后的软件耗时最少。

对于给定的 m 个补丁程序,找到总耗时最少的软件修复方案。


Input

第 i 而改变。


Output

将总耗时数输出。如果问题无解,则输出 0


Sample Input

3 3 
1 000 00- 
1 00- 0-+ 
2 0– -++


Sample Output

8

 

相关文章:

  • 2021-08-31
  • 2021-12-25
  • 2021-12-20
  • 2021-05-30
  • 2022-02-09
  • 2021-10-16
猜你喜欢
  • 2021-10-19
  • 2022-12-23
  • 2021-10-20
  • 2022-12-23
  • 2021-08-05
  • 2022-01-14
相关资源
相似解决方案