这意味着更复杂的问题,关键的事实被抽象出来:每个点,能够赋予既有的值(挑两个一。需要选择,设定ai,bi)。

寻找所有和最大。有条件:如果两个点同时满足:

1,:二进制只是有一个不同之处。  2:中的至少一个被选择B值。 则可获得相应加成。

这题開始想了半天,建图遇到问题。看了官方说是最小割。于是入手:

a值就是小于阈值的最大值,B值就是大于等于的最大值。

思路:俩个点选其一。必定想到建二分(每一个点一分为二)图。中间连无穷的边。由于仅仅有一位不同,必定分奇偶点,有奇数个1的点,源点到他为A值,相应点到汇点为B值。偶点相反。然后以下奇点向偶点中仅仅有一位不同的点连边,为(ui^uj)。理由:先全部值都取,舍去最小割,便是答案。当都选A值的时候。那么附加的值就不能取了。必是要成为割边,这也是分奇数偶数连发不同的原因,这恰好把同側的关系分到异側了。题目仅仅要方案。不要最值。有负数,先都加2014.  ans=全部权之和-最小割-n*1024。

  1. #include<iostream> //15MS
  2. #include<cstdio>
  3. #include<queue>
  4. #include<vector>
  5. using namespace std;
  6. int n,m,nn,mm,ss,tt;
  7. const int inf=0x3f3f3f3f;
  8. const int maxn=1025,maxe=780000;
  9. int rge[maxn];int ui[maxn];
  10. int a[maxn][maxn];
  11. struct xy
  12. {
  13. int low,high;
  14. };
  15. xy dian[maxn];
  16. int head[maxn];int nume=0;int e[maxe][3];
  17. void inline adde(int i,int j,int w)
  18. {
  19. e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;
  20. e[nume++][2]=w;
  21. e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;
  22. e[nume++][2]=0;
  23. }
  24. int has1(int i)
  25. {
  26. int ant=0;
  27. while(i)
  28. {
  29. if(i&1)ant++;
  30. i=(i>>1);
  31. }
  32. return ant;
  33. }
  34. void build()
  35. {
  36. for(int i=0;i<nn;i++)
  37. {
  38. adde(i+1,i+nn+1,inf);
  39. if(has1(i)&1)
  40. {
  41. if(dian[i].low!=-1)
  42. adde(ss,i+1,a[i][dian[i].low]);
  43. else
  44. {
  45. adde(ss,i+1,0);
  46. }
  47. adde(i+nn+1,tt,a[i][dian[i].high]);
  48. for(int j=0;j<nn;j++)
  49. {
  50. if(has1(j^i)==1)
  51. {
  52. adde(i+1,1+j+nn,ui[i]^ui[j]);
  53. }
  54. }
  55. }
  56. else
  57. {
  58. if(dian[i].low!=-1)
  59. adde(i+nn+1,tt,a[i][dian[i].low]);
  60. else
  61. {
  62. adde(i+nn+1,tt,0);
  63. }
  64. adde(ss,i+1,a[i][dian[i].high]);
  65. }
  66. }
  67. }
  68. int vis[maxn];int lev[maxn];
  69. bool bfs()
  70. {
  71. for(int i=0;i<tt+2;i++)
  72. lev[i]=vis[i]=0;
  73. queue<int>q;
  74. q.push(ss);
  75. vis[ss]=1;
  76. while(!q.empty())
  77. {
  78. int cur=q.front();
  79. q.pop();
  80. for(int j=head[cur];j!=-1;j=e[j][1])
  81. {
  82. int v=e[j][0];
  83. if(!vis[v]&&e[j][2]>0)
  84. {
  85. vis[v]=1;
  86. lev[v]=lev[cur]+1;
  87. q.push(v);
  88. }
  89. }
  90. }
  91. return vis[tt];
  92. }
  93. int dfs(int cur,int minf)
  94. {
  95. if(cur==tt||minf==0)return minf;
  96. int sumf=0,f;
  97. for(int j=head[cur];j!=-1&&minf;j=e[j][1])
  98. {
  99. int v=e[j][0];
  100. if(lev[v]==lev[cur]+1&&e[j][2]>0)
  101. {
  102. f=dfs(v,e[j][2]<minf?
  103.  
  104. e[j][2]:minf);
  105. minf-=f;sumf+=f;
  106. e[j][2]-=f;e[j^1][2]+=f;
  107. }
  108. }
  109. if(!sumf) lev[cur]=-1;
  110. return sumf;
  111. }
  112. int dinic()
  113. {
  114. int sums=0;
  115. while(bfs())
  116. {
  117. sums+=dfs(ss,inf);
  118. }
  119. return sums;
  120. }
  121. void init()
  122. {
  123. scanf("%d%d",&n,&m);
  124. nn=(1<<n),mm=(1<<m);
  125. ss=0,tt=2*nn+1;
  126. for(int i=0;i<=tt+1;i++)
  127. {
  128. head[i]=-1;
  129. }
  130. nume=0;
  131. for(int i=0;i<nn;i++)
  132. scanf("%d",&rge[i]);
  133. for(int i=0;i<nn;i++)
  134. scanf("%d",&ui[i]);
  135. for(int i=0;i<nn;i++)
  136. for(int j=0;j<mm;j++)
  137. {
  138. scanf("%d",&a[i][j]);
  139. a[i][j]+=1024;
  140. }
  141. for(int i=0;i<nn;i++)
  142. {
  143. dian[i].low=-1;
  144. int max1=0,max2=0;
  145. for(int j=0;j<rge[i];j++)
  146. {
  147. if(a[i][j]>max1){max1=a[i][j];dian[i].low=j;}
  148. }
  149. for(int j=rge[i];j<mm;j++)
  150. {
  151. if(a[i][j]>max2){max2=a[i][j];dian[i].high=j;}
  152. }
  153. }
  154. }
  155. int main()
  156. {
  157. int T;
  158. scanf("%d",&T);
  159. while(T--)
  160. {
  161. init();
  162. build();
  163. dinic();
  164. for(int i=1;i<nn;i++)
  165. if(vis[i]&&(has1(i-1)&1)||!vis[i]&&!(has1(i-1)&1))
  166. printf("%d ",dian[i-1].low);
  167. else
  168. printf("%d ",dian[i-1].high);
  169. if(vis[nn]&&(has1(nn-1)&1)||!vis[nn]&&!(has1(nn-1)&1))
  170. printf("%d\n",dian[nn-1].low);
  171. else printf("%d\n",dian[nn-1].high);
  172. }
  173. return 0;
  174. }

版权声明:本文博客原创文章,博客,未经同意,不得转载。

hdu 5076 最小割灵活运用的更多相关文章

  1. hdu 4289(最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4289 思路:求最小花费,最小割应用,将点权转化为边权,拆点,(i,i+n)之间连边,容量为在城市i的花 ...

  2. Game HDU - 3657(最小割)

    Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. hdu 1565 最小割

    黑白染色,源指向白,黑指向汇,容量都是方格中数的大小,相邻的格子白指向黑,容量为oo,然后求一次最小割. 这个割是一个简单割,如果只选择不在割中的点,那么一种割就和一个选数方案一一对应,割的大小就是不 ...

  4. hdu 3657 最小割的活用 / 奇偶方格取数类经典题 /最小割

    题意:方格取数,如果取了相邻的数,那么要付出一定代价.(代价为2*(X&Y))(开始用费用流,敲升级版3820,跪...) 建图:  对于相邻问题,经典方法:奇偶建立二分图.对于相邻两点连边2 ...

  5. Being a Hero (hdu 3251 最小割 好题)

    Being a Hero Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  6. hdu 3657 最小割(牛逼!!!!)总算理解了

    <strong></strong> 转载:http://blog.csdn.net/me4546/article/details/6662959 加颜色的太棒了!!! 在网上看 ...

  7. hdu 3691最小割将一个图分成两部分

    转载地址:http://blog.csdn.net/xdu_truth/article/details/8104721 题意:题给出一个无向图和一个源点,让你求从这个点出发到某个点最大流的最小值.由最 ...

  8. [HDU 3521] [最小割] Being a Hero

    题意: 在一个有向图中,有n个点,m条边$n \le 1000 \And \And  m \le 100000$ 每条边有一个破坏的花费,有些点可以被选择并获得对应的金币. 假设一个可以选的点是$x$ ...

  9. hdu 1569 最小割

    和HDU 1565是一道题,只是数据加强了,貌似轮廓线DP来不了了. #include <cstdio> #include <cstring> #include <que ...

随机推荐

  1. boost事件处理

    尽管这个库的名字乍一看好象有点误导,但实际上并不是如此. Boost.Signals 所实现的模式被命名为 '信号至插槽' (signal to slot).它基于下面概念:当相应的信号被发出时.相关 ...

  2. SharePoint发展 - 使用Session(代码更改webconfig)

    博客地址 http://blog.csdn.net/foxdave SharePoint启用Session能够使用Powershell,戳这里:能够改动webconfig. 本篇叙述的重点是通过fea ...

  3. jenkins集群加入Windows 2012 server作为slave

    必须安装.net framework 3.5, 參考: http://technet.microsoft.com/en-us/library/dn482071.aspx 不要在windows 2012 ...

  4. eclipse 代码清理 代码格式化 代码凝视

    Code Style包含两个方面:代码清理,代码规范化.代码清理能够參考: http://www.ibm.com/developerworks/cn/opensource/os-eclipse-cle ...

  5. 前端构建工具gulp

    前端构建工具gulp使用   前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gul ...

  6. 【夸QT在十五】ctkPluginFrameWork插件系统Windows编译器

    采用ctkPluginFramework作为一个插件系统开发框架确实有很多优点. 有些车站最近收到的一封信,每个人都想用ctkPluginFramework但我不知道如何建立,本教程对谈ctkPlug ...

  7. iOS相机去黑框

    自己定义相机的时候,调用系统的相机,因为相机的分辨率,会出现短小的矩形框,总会出现黑色边框,例如以下图: 假设想实现全屏相机的话,这样做就能够了: CALayer *viewLayer = self. ...

  8. gradle下载(转)

    http://services.gradle.org/distributions services.gradle.org/ distributions/ gradle-2.2.1-rc-1-all.z ...

  9. 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23866427 今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取 ...

  10. CAS实现SSO单点登录原理(转)

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...