记录编号 387165 评测结果 AAAAAAAA
题目名称 软件补丁 最终得分 100
用户昵称 Gravatarnonamenotitle 是否通过 通过
代码语言 C++ 运行时间 0.046 s
提交时间 2017-03-26 00:19:40 内存使用 10.32 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <queue>
  8.  
  9. using namespace std;
  10. const int inf=0x3f3f3f3f;
  11. const int maxn=21;
  12. const int maxm=120;
  13. int n,m;
  14. struct point
  15. {
  16. int f1,f2;//增加的错误 减少的错误
  17. int b1,b2;//需要的错误 不要的错误
  18. int cost;
  19. }p[maxm];
  20.  
  21. int dis[1<<21];
  22. bool inque[1<<21];
  23.  
  24. bool judge(int u,int i)
  25. {
  26. bool flag=true;
  27. if((u|(p[i].b1))!=u)
  28. {
  29. /*
  30. printf("u|p[i].b1=%d\n",u|(p[i].b1));
  31. printf("%d\n",u);
  32. */
  33. flag=false;
  34. }
  35. if(p[i].b2&u)//若p[i].b2&n不为0
  36. //那么一定有一个数位上既是b2中不允许存在的
  37. //并且此数位在n中存在
  38. {
  39. flag=false;
  40. }
  41. return flag;
  42. }
  43.  
  44. void spfa()
  45. {
  46. queue<int > q;
  47. q.push((1<<n)-1);
  48. inque[(1<<(n))-1]=true;
  49. memset(dis,inf,sizeof(dis));
  50. dis[(1<<(n))-1]=0;
  51. while(!q.empty())
  52. {
  53. int now=q.front();
  54. q.pop();
  55. inque[now]=false;
  56. for(int i=0;i<m;i++)
  57. {
  58. if(judge(now,i))
  59. {
  60. int u=(now&(~p[i].f2))|(p[i].f1);
  61. /*
  62. printf("now=%d\n",now);
  63. printf("p[%d].f2=%d\n",i,p[i].f2);
  64. printf("~p[%d].f2=%d\n",i,~p[i].f2);
  65. printf("p[%d].f1=%d\n",i,p[i].f1);
  66. printf("%d\n",u);
  67. */
  68. if(dis[u]>dis[now]+p[i].cost)
  69. {
  70. dis[u]=dis[now]+p[i].cost;
  71. if(!inque[u])
  72. {
  73. q.push(u);
  74. inque[u]=true;
  75. }
  76. }
  77. }
  78. }
  79. }
  80. }
  81.  
  82. int main()
  83. {
  84. freopen("bugs.in","r",stdin);
  85. freopen("bugs.out","w",stdout);
  86. scanf("%d%d",&n,&m);
  87. for(int i=0;i<m;i++)
  88. {
  89. int cost;
  90. char buff1[maxn],buff2[maxn];
  91. memset(buff1,0,sizeof(buff1));
  92. memset(buff2,0,sizeof(buff2));
  93. scanf("%d%s%s",&cost,buff1,buff2);
  94. p[i].cost=cost;
  95. int len=strlen(buff1);
  96. len--;
  97. for(int j=0;j<(int)strlen(buff1);j++)
  98. {
  99. if(buff1[j]=='+')
  100. {
  101. p[i].b1+=1<<(len-j);
  102. }
  103. if(buff1[j]=='-')
  104. {
  105. p[i].b2+=1<<(len-j);
  106. }
  107. if(buff2[j]=='+')
  108. {
  109. p[i].f1+=1<<(len-j);
  110. }
  111. if(buff2[j]=='-')
  112. {
  113. p[i].f2+=1<<(len-j);
  114. }
  115. }
  116. }
  117. spfa();
  118. /*
  119. printf("dis:\n");
  120. for(int i=0;i<1<<n;i++)
  121. {
  122. printf("%d ",dis[i]);
  123. }
  124. printf("\n");
  125. */
  126. if(dis[0]!=inf)
  127. {
  128. printf("%d\n",dis[0]);
  129. }
  130. else
  131. {
  132. printf("-1\n");
  133. }
  134. return 0;
  135. }