记录编号 238145 评测结果 AAAAAAAAAA
题目名称 [HAOI 2013]开关控制 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.015 s
提交时间 2016-03-18 17:59:01 内存使用 0.29 MiB
显示代码纯文本
  1. #include<cstdio>
  2. bool l[50][50];int n,m;
  3. void Xor(int a,int b){
  4. for(int i=1;i<=n+1;++i)l[a][i]^=l[b][i];
  5. }
  6. void swap(int a,int b){
  7. for(int i=1;i<=n+1;++i)l[a][i]^=l[b][i]^=l[a][i]^=l[b][i];
  8. }
  9. void xiaoyuan(){
  10. for(int i=1;i<n;++i){
  11. if(!l[i][i]){
  12. for(int j=i+1;j<=n;++j){
  13. if(l[j][i]){
  14. swap(i,j);
  15. break;
  16. }
  17. }
  18. }
  19. for(int j=i+1;j<=n;++j)if(l[j][i])Xor(j,i);
  20. }
  21. }
  22. int ans=1<<20,now=0;
  23. void dfs(int x){
  24. if(now>ans)return;
  25. if(x==0){
  26. if(now<ans)ans=now;
  27. return;
  28. }
  29. if(l[x][x]){//注意这时候第x盏灯未必要被按下。。。要考虑常数项的变化
  30. int tmp=l[x][n+1];
  31. for(int i=x-1;i>0;--i){
  32. if(l[i][x])l[i][n+1]^=tmp;
  33. }
  34. now+=tmp;
  35. dfs(x-1);
  36. now-=tmp;
  37. for(int i=x-1;i>0;--i){
  38. if(l[i][x])l[i][n+1]^=tmp;
  39. }
  40. }
  41. else{
  42. //假想这个变量为1
  43. for(int i=x-1;i>0;--i){
  44. if(l[i][x])l[i][n+1]^=1;
  45. }
  46. now++;
  47. dfs(x-1);
  48. now--;
  49. //恢复
  50. for(int i=x-1;i>0;--i){
  51. if(l[i][x])l[i][n+1]^=1;
  52. }
  53. //假想这个变量为0
  54. dfs(x-1);
  55. }
  56. }
  57. int main(){
  58. freopen("haoi13t3.in","r",stdin);
  59. freopen("haoi13t3.out","w",stdout);
  60. scanf("%d %d",&n,&m);
  61. int a,b;
  62. while(m--){
  63. scanf("%d %d",&a,&b);
  64. l[a][b]=l[b][a]=true;
  65. }
  66. for(int i=1;i<=n;++i)l[i][i]=true;
  67. for(int i=1;i<=n;++i)l[i][n+1]=true;
  68. xiaoyuan();
  69. dfs(n);
  70. printf("%d\n",ans);
  71. fclose(stdin);fclose(stdout);
  72. return 0;
  73. }
  74. /*
  75. 16 45
  76. 7 8
  77. 4 15
  78. 11 9
  79. 12 7
  80. 16 10
  81. 6 11
  82. 5 9
  83. 4 12
  84. 10 4
  85. 15 12
  86. 1 6
  87. 6 13
  88. 7 15
  89. 6 5
  90. 4 14
  91. 11 10
  92. 13 8
  93. 1 14
  94. 3 12
  95. 7 2
  96. 4 6
  97. 16 1
  98. 10 8
  99. 10 15
  100. 2 4
  101. 16 9
  102. 10 1
  103. 14 6
  104. 16 6
  105. 13 1
  106. 8 16
  107. 9 10
  108. 3 2
  109. 10 7
  110. 14 15
  111. 4 9
  112. 14 10
  113. 5 16
  114. 3 5
  115. 9 12
  116. 16 2
  117. 12 6
  118. 13 9
  119. 3 11
  120. 12 16
  121.  
  122. output:8
  123. */