Problem A simple brute force problem (HDU 4971)

题目大意

  有n个项目和m个问题,完成每个项目有对应收入,解决每个问题需要对应花费,给出每个项目需解决的问题以及各问题间的依赖关系,求最大利润。

解题分析

  最大权闭合子图  用来解决一下有依赖关系的问题。

  X集权值为正,Y集权值为负。X集的某些点依赖于Y集,Y集的某些点互相依赖。

  从S向X集的每个点连流量为权值的边,y集的每个点向T连流量为权值的边,若两个点互相依赖,则连一条权值为INF的边。

  求一遍最小割,最后答案为X集总权值减去最小割。

参考程序

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <queue>
  5. using namespace std;
  6.  
  7. #define INF 2000000000
  8. #define V 100
  9. #define E 100000
  10. int n,m,ans,dis[V],S,T;
  11.  
  12. struct line{
  13. int u,v,c,nt;
  14. }eg[E];
  15. int lt[V],sum=;
  16.  
  17. void adt(int u,int v,int c){
  18. eg[++sum].u=u; eg[sum].v=v; eg[sum].c=c; eg[sum].nt=lt[u]; lt[u]=sum;
  19. }
  20.  
  21. void add(int u,int v,int c){
  22. adt(u,v,c); adt(v,u,);
  23. }
  24.  
  25. void init(){
  26. memset(lt,,sizeof(lt));
  27. sum=; ans=;
  28. }
  29.  
  30. bool bfs(){
  31. memset(dis,,sizeof(dis));
  32. dis[S]=;
  33. queue<int> Q;
  34. Q.push(S);
  35. while (!Q.empty()){
  36. int u=Q.front();
  37. Q.pop();
  38. for (int i=lt[u];i;i=eg[i].nt){
  39. int v=eg[i].v;
  40. if (eg[i].c && !dis[v]){
  41. dis[v]=dis[u]+;
  42. Q.push(v);
  43. }
  44. }
  45. }
  46. return dis[T]>;
  47. }
  48.  
  49. int dfs(int u,int flow){
  50. if (u==T) return flow;
  51. int res=,f;
  52. for (int i=lt[u];i;i=eg[i].nt){
  53. int v=eg[i].v;
  54. if (eg[i].c&&dis[v]==dis[u]+){
  55. f=dfs(v,min(flow-res,eg[i].c));
  56. res+=f;
  57. eg[i].c-=f;
  58. eg[i ^ ].c+=f;
  59. if (flow==res) break;
  60. }
  61. }
  62. if (!res) dis[u]=-;
  63. return res;
  64. }
  65.  
  66. int dinic(){
  67. int sum=;
  68. while (bfs()) sum+=dfs(S,INF);
  69. return sum;
  70. }
  71. int main(){
  72.  
  73. int Tp,cas=;
  74. scanf("%d",&Tp);
  75. while (Tp--){
  76. init();
  77. scanf("%d %d",&n,&m);
  78. S=,T=n+m+;
  79. int x;
  80. for (int i=;i<=n;i++){
  81. scanf("%d",&x);
  82. add(S,i,x);
  83. ans+=x;
  84. }
  85. for (int i=;i<=m;i++){
  86. scanf("%d",&x);
  87. add(i+n,T,x);
  88. }
  89. for (int i=;i<=n;i++){
  90. int num;
  91. scanf("%d",&num);
  92. for (int j=;j<=num;j++){
  93. scanf("%d",&x);
  94. add(i,x++n,INF);
  95. }
  96. }
  97. for (int i=;i<=m;i++)
  98. for (int j=;j<=m;j++){
  99. scanf("%d",&x);
  100. if (x) add(i+n,j+n,INF);
  101. }
  102. n=T;
  103. printf("Case #%d: %d\n",++cas,ans-dinic());
  104. }
  105. }

HDU 4971 (最小割)的更多相关文章

  1. hdu 4289(最小割)

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

  2. hdu 5076 最小割灵活运用

    这意味着更复杂的问题,关键的事实被抽象出来:每个点,能够赋予既有的值(挑两个一.需要选择,设定ai,bi). 寻找所有和最大.有条件:如果两个点同时满足: 1,:二进制只是有一个不同之处.  2:中的 ...

  3. Game HDU - 3657(最小割)

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

  4. hdu 1565 最小割

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

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

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

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

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

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

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

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

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

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

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

  10. hdu 1569 最小割

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

随机推荐

  1. 在CentOS 7 MySQL / MariaDB

    在CentOS7中,MariaDB  替代了MySQL;更多复杂的疑问可以在这里查看 MariaDB versus MySQL – Compatibility Install MySQL / Mari ...

  2. 《JavaScript权威指南》读书笔记(三)

    日期:2015-12-05 浏览器location和history: replace不会显示历史,location会: history对象脚本不能真正访问,但支持三种方法:back().foward( ...

  3. Sql语句统计多表个数并求和

    ) FROM ((SELECT BaseID FROM dbo.Life_cheliang WHERE BaseCreateDate BETWEEN '2015-6-5' AND '2015-6-11 ...

  4. hat linux下vnc的安装

    1.在系统文件下找到vnc的rpm包(检测是否安装vnc) 系统文件寻找方法 进入到根目录(可通过pwd确认当前目录,/则表示根目录) 根目录下有个一个media,进入此目录 media目录下有个一个 ...

  5. JQuery时间轴timeline插件的学习-Lateral On-Scroll Sliding with jQuery+technotarek / timeliner

    一.Lateral On-Scroll Sliding with jQuery的使用 View demo      Download source 1. HTML结构 <div id=" ...

  6. 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据

    一致性哈希算法 摘自:http://blog.codinglabs.org/articles/consistent-hashing.html 算法简述 一致性哈希算法(Consistent Hashi ...

  7. spring mvc表单自动装入实体对象

    <form action="/springmvc1/user/add" method="post"> id: <input type=&quo ...

  8. Android 解压html压缩数据

    public static String unzipHTML(String s){ int endPos = s.indexOf("\r\n\r\n"); if(endPos< ...

  9. 判断comboBox是否选对了绑定的数据库中的项

    实现: comboBox1下拉列表已绑定数据库,将选中的项保存到数据库时,判断是否已选中下拉列表里的项 如果没选中,或者输入了其他的值,和已绑定的数据不匹配,出现提示框 按钮的点击事件中: strin ...

  10. sql遍历树

    oracle有直接的sql来遍历一颗树的子节点和父节点 遍历一个节点的所有子节点(classid的值就是该节点的值) select *  from organization_ a start with ...