题意:n(n <= 20)个项目,m(m <= 50)个技术问题,做完一个项目能够有收益profit (<= 1000),做完一个项目必须解决对应的技术问题,解决一个技术问题须要付出cost ( <= 1000),技术问题之间有先后依赖关系,求最大收益。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4971

——>>项目必须解决相应的技术问题,技术问题之间也存在依赖,相应闭合图,最大收益相应最大权和。。于是,最大权闭合图,最小割,最大流上场。。

建图:

1)超级源S = n + m, 超级汇T = n + m + 1

2)对于每一个项目i:S -> i (profit[i])

3)对于每一个技术问题i:i + n -> T (cost[i])

4)对于项目 i 必须解决的技术问题 j:i -> j + n (INF)

5)对于技术问题 j 必须先解决的技术问题
i: i + n -> j + n (INF) (这里我认为应为:j + n -> i + n (INF),这样理解才对,但是对不上例子,提交也WA。。)

然后,Dinic上场。。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <queue>
  5.  
  6. using std::queue;
  7. using std::min;
  8.  
  9. const int MAXN = 20 + 50 + 10;
  10. const int MAXM = 20 + 1000 + 2500 + 50 + 10;
  11. const int INF = 0x3f3f3f3f;
  12.  
  13. int n, m, sum;
  14. int hed[MAXN];
  15. int cur[MAXN], h[MAXN];
  16. int ecnt;
  17. int S, T;
  18.  
  19. struct EDGE
  20. {
  21. int to;
  22. int cap;
  23. int flow;
  24. int nxt;
  25. } edges[MAXM << 1];
  26.  
  27. void Init()
  28. {
  29. ecnt = 0;
  30. memset(hed, -1, sizeof(hed));
  31. sum = 0;
  32. }
  33.  
  34. void AddEdge(int u, int v, int cap)
  35. {
  36. edges[ecnt].to = v;
  37. edges[ecnt].cap = cap;
  38. edges[ecnt].flow = 0;
  39. edges[ecnt].nxt = hed[u];
  40. hed[u] = ecnt++;
  41. edges[ecnt].to = u;
  42. edges[ecnt].cap = 0;
  43. edges[ecnt].flow = 0;
  44. edges[ecnt].nxt = hed[v];
  45. hed[v] = ecnt++;
  46. }
  47.  
  48. void Read()
  49. {
  50. int profit, cost, pc, tp;
  51.  
  52. scanf("%d%d", &n, &m);
  53. S = n + m;
  54. T = n + m + 3;
  55. for (int i = 0; i < n; ++i)
  56. {
  57. scanf("%d", &profit);
  58. AddEdge(S, i, profit);
  59. sum += profit;
  60. }
  61. for (int i = 0; i < m; ++i)
  62. {
  63. scanf("%d", &cost);
  64. AddEdge(i + n, T, cost);
  65. }
  66. for (int i = 0; i < n; ++i)
  67. {
  68. scanf("%d", &pc);
  69. for (int j = 0; j < pc; ++j)
  70. {
  71. scanf("%d", &tp);
  72. AddEdge(i, tp + n, INF);
  73. }
  74. }
  75. for (int i = 0; i < m; ++i)
  76. {
  77. for (int j = 0; j < m; ++j)
  78. {
  79. scanf("%d", &tp);
  80. if (tp)
  81. {
  82. AddEdge(i + n, j + n, INF);
  83. }
  84. }
  85. }
  86. }
  87.  
  88. bool Bfs()
  89. {
  90. memset(h, -1, sizeof(h));
  91. queue<int> qu;
  92. qu.push(S);
  93. h[S] = 0;
  94. while (!qu.empty())
  95. {
  96. int u = qu.front();
  97. qu.pop();
  98. for (int e = hed[u]; e != -1; e = edges[e].nxt)
  99. {
  100. int v = edges[e].to;
  101. if (h[v] == -1 && edges[e].cap > edges[e].flow)
  102. {
  103. h[v] = h[u] + 1;
  104. qu.push(v);
  105. }
  106. }
  107. }
  108.  
  109. return h[T] != -1;
  110. }
  111.  
  112. int Dfs(int u, int cap)
  113. {
  114. if (u == T || cap == 0) return cap;
  115.  
  116. int flow = 0, subFlow;
  117. for (int e = cur[u]; e != -1; e = edges[e].nxt)
  118. {
  119. cur[u] = e;
  120. int v = edges[e].to;
  121. if (h[v] == h[u] + 1 && (subFlow = Dfs(v, min(cap, edges[e].cap - edges[e].flow))) > 0)
  122. {
  123. flow += subFlow;
  124. edges[e].flow += subFlow;
  125. edges[e ^ 1].flow -= subFlow;
  126. cap -= subFlow;
  127. if (cap == 0) break;
  128. }
  129. }
  130.  
  131. return flow;
  132. }
  133.  
  134. int Dinic()
  135. {
  136. int maxFlow = 0;
  137.  
  138. while (Bfs())
  139. {
  140. memcpy(cur, hed, sizeof(hed));
  141. maxFlow += Dfs(S, INF);
  142. }
  143.  
  144. return maxFlow;
  145. }
  146.  
  147. int main()
  148. {
  149. int t, kase = 0;
  150.  
  151. scanf("%d", &t);
  152. while (t--)
  153. {
  154. Init();
  155. Read();
  156. printf("Case #%d: %d\n", ++kase, sum - Dinic());
  157. }
  158.  
  159. return 0;
  160. }

hdu - 4971 - A simple brute force problem.(最大权闭合图)的更多相关文章

  1. HDU 4971 A simple brute force problem.

    A simple brute force problem. Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged o ...

  2. HDU 4971 - A simple brute force problem【最大权闭合图】

    有n(20)个工程,完成每个工程获得收益是p[i],m(50)个需要解决的难题,解决每个难题花费是c[i] 要完成第i个工程,需要先解决ki个问题,具体哪些问题,输入会给出 每个难题之间可能有依赖关系 ...

  3. 【最小割】HDU 4971 A simple brute force problem.

    说是最大权闭合图.... 比赛时没敢写.... 题意 一共同拥有n个任务,m个技术 完毕一个任务可盈利一些钱,学习一个技术要花费钱 完毕某个任务前须要先学习某几个技术 可是可能在学习一个任务前须要学习 ...

  4. HDU4971 A simple brute force problem.(强连通分量缩点 + 最大权闭合子图)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4971 Description There's a company with several ...

  5. A simple brute force problem.

    hdu4971:http://acm.hdu.edu.cn/showproblem.php?pid=4971 题意:给你n个项目,每完成一个项目会有一定的收益,但是为了完成某个项目,要先学会一些技能, ...

  6. HDU5772 String problem 最大权闭合图+巧妙建图

    题意:自己看吧(不是很好说) 分析: 网络流:最大权闭合子图. 思路如下: 首先将点分为3类 第一类:Pij 表示第i个点和第j个点组合的点,那么Pij的权值等于w[i][j]+w[j][i](表示得 ...

  7. hdu 4972 A simple dynamic programming problem(高效)

    pid=4972" target="_blank" style="">题目链接:hdu 4972 A simple dynamic progra ...

  8. HDU 3879 && BZOJ 1497:Base Station && 最大获利 (最大权闭合图)

    http://acm.hdu.edu.cn/showproblem.php?pid=3879 http://www.lydsy.com/JudgeOnline/problem.php?id=1497 ...

  9. hdu 3061 Battle 最大权闭合图

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3061 由于小白同学近期习武十分刻苦,很快被晋升为天策军的统帅.而他上任的第一天,就面对了一场极其困难的 ...

随机推荐

  1. 4、qq物联SDK介绍及实例讲解

    1.到QQ物联官网http://iot.open.qq.com中下载软件SDK S3C2440_20161122_1.6.205_r4288.tar.gz注意:在后续大家实际开发过程中,可能你会下载到 ...

  2. 07_android入门_採用HttpClient的POST方式、GET方式分别实现登陆案例

    1.简单介绍 HttpClient 是 Apache Jakarta Common 下的子项目,能够用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,而且它支持 HTTP 协议 ...

  3. [Angular] Angular Advanced Features - ng-template , ng-container, ngTemplateOutlet

    Previously we have tab-panel template defined like this: <ul class="tab-panel-buttons" ...

  4. Chinese remainder theorem

    https://en.wikipedia.org/wiki/Chinese_remainder_theorem http://planetmath.org/ChineseRemainderTheore ...

  5. JAVA学习路线图---(JAVA1234) 分类: B1_JAVA 2013-10-05 10:22 502人阅读 评论(1) 收藏

    转自:http://blog.csdn.net/pplcheer/article/details/12276999 第一阶段-Java基础        这一阶段很重要,关系到你后面阶段的学习,所以务 ...

  6. python implementation for Qt's QDataStream(看一下QDataStream的结构)

    #!/usr/bin/env python # -*- coding: utf- -*- from __future__ import print_function from __future__ i ...

  7. 【42.07%】【codeforces 558A】Lala Land and Apple Trees

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  8. CoreData使用方法二:NSFetchedResultsController实例操作与解说

    学习了NSFetchedResultsController.才深深的体会到coredata的牛逼之处.原来Apple公司弄个新技术.不是平白无故的去弄,会给代码执行到来非常大的优点.coredata不 ...

  9. C# WebQQ协议群发机器人(一)

    原创性申明 本文地址 http://blog.csdn.net/zhujunxxxxx/article/details/38931287 转载的话请注明出处. 之前我也写过一篇使用python来实现的 ...

  10. 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(7)结构体

    一.为什么需要结构体? 为了表示一些复杂的事物,而普通类型无法满足实际需求 二.什么叫结构体? 把一些基本类型组合在一起形成的一个新的复合数据类型叫做结构体. 三.如何定义一个结构体? 第一种方式: ...