hdu4971:http://acm.hdu.edu.cn/showproblem.php?pid=4971

题意:给你n个项目,每完成一个项目会有一定的收益,但是为了完成某个项目,要先学会一些技能,学习每个技能会有一定的花费。并且,在学习某项技能之前,可能需要需要先学习前一种技能,最后问你最后能够获得的最大的收益。

题解:这一题,很容易想到网络流,关键是建图,首先把每个技能拆点,两个点之间的容量就是每个技能的花费。人然后右边的边和会点建立一边,容量无穷大,然后就是每个项目的到技能左边的点连接一条边,容量无穷大,然后是源点和每个项目之间建立一条边,容量就是收益。最后就是技能之间的,如果学习i技能之前要学习j技能,那么i的左端点到j的左端点之间连一边,容量无穷大。然后跑网络流,最终的答案就是总收益减去总流量。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdio>
  5. #include<queue>
  6. #define INF 100000000
  7. using namespace std;
  8. const int N=;
  9. const int M=;
  10. struct Node{
  11. int v;
  12. int f;
  13. int next;
  14. }edge[M];
  15. int n,m,u,v,cnt,sx,ex;
  16. int head[N],pre[N],visit[N];
  17. int val1[N],val2[N];
  18. void init(){
  19. cnt=;
  20. //memset(edge,0,sizeof(edge));
  21. memset(head,-,sizeof(head));
  22. }
  23. void add(int u,int v,int w){
  24. edge[cnt].v=v;
  25. edge[cnt].f=w;
  26. edge[cnt].next=head[u];
  27. head[u]=cnt++;
  28. edge[cnt].f=;
  29. edge[cnt].v=u;
  30. edge[cnt].next=head[v];
  31. head[v]=cnt++;
  32. }
  33. bool BFS(){
  34. memset(pre,,sizeof(pre));
  35. pre[sx]=;
  36. queue<int>Q;
  37. Q.push(sx);
  38. while(!Q.empty()){
  39. int d=Q.front();
  40. Q.pop();
  41. for(int i=head[d];i!=-;i=edge[i].next ){
  42. if(edge[i].f&&!pre[edge[i].v]){
  43. pre[edge[i].v]=pre[d]+;
  44. Q.push(edge[i].v);
  45. }
  46. }
  47. }
  48. return pre[ex]>;
  49. }
  50. int dinic(int flow,int ps){
  51. int f=flow;
  52. if(ps==ex)return f;
  53. for(int i=head[ps];i!=-;i=edge[i].next){
  54. if(edge[i].f&&pre[edge[i].v]==pre[ps]+){
  55. int a=edge[i].f;
  56. int t=dinic(min(a,flow),edge[i].v);
  57. edge[i].f-=t;
  58. edge[i^].f+=t;
  59. flow-=t;
  60. if(flow<=)break;
  61. }
  62.  
  63. }
  64. if(f-flow<=)pre[ps]=-;
  65. return f-flow;
  66. }
  67. int solve(){
  68. int sum=;
  69. while(BFS())
  70. sum+=dinic(INF,sx);
  71. return sum;
  72. }
  73. int main() {
  74. int T,k,temp,sum,tt=;
  75. scanf("%d",&T);
  76. while(T--) {
  77. scanf("%d%d",&n,&m);
  78. sum=;
  79. init();
  80. for(int i=; i<=n; i++) {
  81. scanf("%d",&val1[i]);
  82. sum+=val1[i];
  83. }
  84. for(int j=;j<=m;j++)
  85. scanf("%d",&val2[j]);
  86. for(int i=;i<=n;i++){
  87. scanf("%d",&k);
  88. for(int j=;j<=k;j++){
  89. scanf("%d",&temp);
  90. add(*m+i,temp+,INF);
  91. }
  92. add(,*m+i,val1[i]);
  93. }
  94. for(int i=;i<=m;i++){
  95. for(int j=;j<=m;j++){
  96. scanf("%d",&temp);
  97. if(temp==){
  98. add(i,j,INF);
  99. }
  100. }
  101. }
  102. for(int i=;i<=m;i++){
  103. add(i,i+m,val2[i]);
  104. add(i+m,*m+n+,INF);
  105. }
  106. sx=;ex=*m+n+;
  107. printf("Case #%d: %d\n",tt++,sum-solve());
  108. }
  109. return ;
  110. }

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. HDU4971 A simple brute force problem.(强连通分量缩点 + 最大权闭合子图)

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

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

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

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

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

  5. hdu - 4971 - A simple brute force problem.(最大权闭合图)

    题意:n(n <= 20)个项目,m(m <= 50)个技术问题,做完一个项目能够有收益profit (<= 1000),做完一个项目必须解决对应的技术问题,解决一个技术问题须要付出 ...

  6. BNU 4356 ——A Simple But Difficult Problem——————【快速幂、模运算】

    A Simple But Difficult Problem Time Limit: 5000ms Memory Limit: 65536KB 64-bit integer IO format: %l ...

  7. HDU 6215 Brute Force Sorting(模拟链表 思维)

    Brute Force Sorting Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

  8. hdu6215 Brute Force Sorting

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6215 题目: Brute Force Sorting Time Limit: 1000/100 ...

  9. hdu4975 A simple Gaussian elimination problem.(正确解法 最大流+删边判环)(Updated 2014-10-16)

    这题标程是错的,网上很多题解也是错的. http://acm.hdu.edu.cn/showproblem.php?pid=4975 2014 Multi-University Training Co ...

随机推荐

  1. Qt学习之路: 国际化(上)

      原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://devbean.blog.51cto.com/448512/244689 2D ...

  2. hadoop错误Cannot load libcrypto.so (libcrypto.so cannot open shared object file No such file or directory)

    报如下错误 解决方法: 1.使用hadoop checknative –a命令检查,报如下错误 2.使用如下命令建立libcrypto.so文件的符号链接 如果,您认为阅读这篇博客让您有些收获,不妨点 ...

  3. asp.net网站性能优化2则

    摘要:Web服务器的性能优化有很多资料介绍了,多台主机负载均衡,查询结果的多级缓 存,数据库索引优化等都是常见的优化手段.随着后端优化空间越来越小,现在越来越多 的网站更注重前端性能的优化,就是浏览器 ...

  4. centos7安装chrome的历程(fedora同)

    安装 首先是下载,地址奉上:http://www.google.cn/chrome/browser/desktop/index.html,选择64 bit .rpm (适用于 Fedora/openS ...

  5. JDK自带方法实现RSA非对称加密

    package jdbc.pro.lin; import java.security.InvalidKeyException; import java.security.Key; import jav ...

  6. Android 设计随便说说之简单实践(模块划分)

    上篇随笔随(Android 设计随便说说)便说了一下什么是设计以及设计的原则,这里举一个简单的例子来进一步的说Android设计.我们以应用商店的设计来举例. 在设计之前,需要把握两部分内容,才能使得 ...

  7. jvm - 内存结构以其解析

    可以将jvm粗略分为以下部分: Heap Memory:存储java对象. Non-Heap Memory:存储加载的class文件,以及其他meta-data信息. Other:存储java代码,j ...

  8. 编写适合windows 7 平台的软件,给程序添加UAC认证

    Delphi程序必须在资源里面嵌入MANIFEST信息 一. 首先编辑一个文件,内容如下: <?xml version="1.0" encoding="UTF-8& ...

  9. 查看oracle 启动了多久

    想看一下系统正常运行了多少天?开机多长时间没有重启了? windows系统 C:\>systeminfo |find “系统启动时间”系统启动时间:     265 天 4 小时 26 分 32 ...

  10. 解决IE无法解析json的方法

    一.原始方法eval() 二.json插件--github开源插件:json-js/json2.js https://github.com/douglascrockford/JSON-js/blob/ ...