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

题意 :

  1. 题意: 有 n 个金矿,每个金矿开发需要一定的价值,开发之后可以获得一定的价值,而且一些金矿受到另一些金矿的限制,即开采这个金矿之前要开采
  2. 限制它的金矿,问最多可以获得多少价值。

题解:

很明显的 最大权闭合图    金矿 ,有  开采的 花费 和价值 ,那么  开采的 利益就 是   价值 - 花费  ;

  1. 如果某个金矿的开发利润为正值,就在源点和该点之间连一条容量为该利润的边
  2. 如果某个金矿的开发利润为负值,就在该点和汇点之间连一条容量为该利润绝对值的边
  3. 如果某个金矿收到另一个金矿的限制,就在两个金矿之间连一条容量为INF的边。
  4. 累计所有正值利润的和  sum,获得的最大利润为sum - maxflow
  1  #include<stdio.h>
  2  #include<cstring>
  3  #include<cmath>
  4  #include<iostream>
  5  #include<algorithm>
  6  #include<set>
  7  #include<map>
  8  #include<queue>
  9  #include<vector>
 10  #include<string>
 11  #define Min(a,b) a<b?a:b
 12  #define Max(a,b) a>b?a:b
 13  #define CL(a,num) memset(a,num,sizeof(a));
 14  #define maxn  5100
 15  #define eps  1e-6
 16  #define inf  10000000000
 17  #define read() freopen("data.in","r",stdin) ;
 18  #define ll __int64
 19  using namespace std;
 20  ll n , m ;
 21  struct node
 22  {
 23      int from;
 24      int to ;
 25      ll flow ;
 26      int next ;
 27  } p[maxn*100];
 28  int  head[maxn] ,s,t,cnt,dis[maxn];
 29  ll a[maxn]  ,ans,num,sum;
 30 
 31  bool vis[maxn] ;
 32 
 33  queue<int>que ;
 34  void add(int from ,int to , ll flow )
 35  {
 36      p[cnt].to = to ;
 37      p[cnt].flow =flow ;
 38      p[cnt].next = head[from] ;
 39      head[from] = cnt++ ;
 40 
 41      p[cnt].to = from ;
 42      p[cnt].flow = 0 ;
 43      p[cnt].next  = head[to] ;
 44      head[to] = cnt++ ;
 45 
 46  }
 47 
 48  int bfs()
 49  {
 50      CL(dis,-1)  ;
 51      dis[s] =  0 ;
 52      int i ;
 53      while(!que.empty())que.pop() ;
 54 
 55      que.push(s) ;
 56      while(!que.empty())
 57      {
 58          int u = que.front() ;que.pop() ;
 59 
 60          for(i = head[u] ; i != -1  ;i = p[i].next)
 61          {
 62                 int v = p[i].to ;
 63 
 64                 ll flow  = p[i].flow ;
 65 
 66                 if(flow > 0)
 67                 if(dis[v] < 0 )
 68                 {
 69                     dis[v] = dis[u] + 1 ;
 70                     que.push(v) ;
 71                 }
 72 
 73          }
 74 
 75      }
 76 
 77      if(dis[t] > 0) return 1;
 78      else return 0 ;
 79 
 80 
 81 
 82  }
 83 
 84 
 85  ll dfs(int x,ll mx)
 86  {
 87 
 88 
 89      if(x == t) return mx ;
 90 
 91      int i ;
 92      ll a ,tf = 0;
 93 
 94 
 95       for(i = head[x] ; i != -1 ; i = p[i].next)
 96       {
 97           int v = p[i].to ;
 98           ll  flow  = p[i].flow ;
 99           if(flow > 0)
100           {
101                if( dis[v] == dis[x] + 1 && (a = dfs(v,min(flow ,mx))))
102             {
103                p[i].flow -= a ;
104                p[i^1].flow += a;
105 
106              return a ;
107             }
108 
109           }
110 
111       }
112 
113 
114       if(!tf) dis[x] = - 1;
115       return tf ;
116 
117  }
118 
119  ll dinic()
120  {
121 
122      ans = 0 ;
123      ll res = 0 ;
124      while(bfs())
125      {
126          while(res = dfs(s,inf))ans += res ;
127      }
128 
129      return  ans  ;
130 
131 
132  }
133 
134 int main()
135 {
136     int T,i,j,a,b,num ;
137     ll cost ,val;
138     scanf("%d",&T);
139     int cas = 0 ;
140     ll  sum ;
141     while(T--)
142     {
143 
144         CL(head, -1) ;
145         cnt = 0 ;
146         sum = 0 ;
147         scanf("%d",&n);
148 
149         s = 0 ;
150         t = n*26 + n + 1 ;
151 
152         for(i = 1 ; i <= n;i++)
153         {
154             scanf("%d",&m);
155             for(j = 1 ;  j <= m;j++)
156             {
157                 scanf("%I64d%I64d%d",&cost,&val,&num);
158 
159                 ll  tmp = val -  cost ;
160                 if(tmp > 0)
161                 {
162                     add(s,i*26 + j,tmp);
163 
164                      sum += tmp ;
165                 }
166                 else
167                 {
168                      add(i*26 + j,t, -tmp) ;
169 
170                 }
171 
172 
173                 while(num--)
174                 {
175                     scanf("%d%d",&a,&b);
176                     add(i*26+j,a*26 + b,inf) ;
177                 }
178             }
179         }
180 
181         ll ans = dinic() ;
182 
183         printf("Case #%d: %I64d\n",++cas,sum - ans) ;
184 
185     }
186 }

转载于:https://www.cnblogs.com/acSzz/archive/2012/11/10/2763896.html

hdu 3996 Gold Mine ( 最大权闭合图 )相关推荐

  1. hdu 3879 Base Station 最大权闭合图

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3879 A famous mobile communication company is plannin ...

  2. HDU 3061 Battle(最小割----最大权闭合图)

    题意: Problem Description 由于小白同学近期习武十分刻苦,很快被晋升为天策军的统帅.而他上任的第一天,就面对了一场极其困难的战斗: 据侦查兵回报,前方共有N座城池,考虑到地势原因, ...

  3. luogu P3410 拍照(最大权闭合图转最小割)

    luogu P3410 拍照 最大权闭合图转最小割 要得到最大收益,我们可以用总可能收益减去最小花费,也就是最小割. #include<cstdio> #include<cstrin ...

  4. 【网络流24题】B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)

    整理的算法模板合集: ACM模板 B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] P2762 太空飞行计划问题 [问题分析] 最大权闭合图问题,可以转化成最小割问题, ...

  5. 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图

    原文地址:http://www.cnblogs.com/GXZlegend/p/6808268.html 题目描述 输入 输出 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何 ...

  6. POJ 2987 Firing(最大权闭合图)

    [题目链接] http://poj.org/problem?id=2987 [题目大意] 为了使得公司效率最高,因此需要进行裁员, 裁去不同的人员有不同的效率提升效果,当然也有可能是负的效果, 如果裁 ...

  7. 最大权闭合 图 讲解

    详见  国家集训队 论文 2007  胡伯涛 <最小割模型在信息学竞赛中的应用> 首先说几个我看时疑惑的问题   1:为什么 割里面的点集就是闭合 图 ? 答:由于 我们见图时,将原图的 ...

  8. Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1105  Solved: 331 [Submit][Sta ...

  9. 洛谷 - P2762 太空飞行计划问题(最大权闭合图+路径打印)

    题目链接:点击查看 题目大意:给出n个实验,每个实验完成之后都可以得到一定的奖金,但每个实验需要特殊的器械才可以完成,准备器械又需要一定的支出,现在问如何选择实验才能让利润最大化,并输出需要选择的实验 ...

  10. POJ - 2987 Firing(最大权闭合图)

    题目链接:点击查看 题目大意:某公司想要裁员,裁员的标准是如果某人被裁,那么其下属也会被裁,依此类推,每一个人都有一个贡献度,问怎样裁员才能使得最后的贡献度最大并且裁掉人数最少 题目分析:最大权闭合图 ...

最新文章

  1. Linux Top 命令解析 比较详细
  2. python在windows的开发环境_Python合集之Python开发环境在Windows系统里面搭建
  3. jquery之ajax请求工具类
  4. ios 动画设计_动画和讲故事在设计中的力量
  5. PHP大势已去,PHP宝藏可为我所用
  6. 吴恩达《机器学习》学习笔记十三——机器学习系统(补充)
  7. 形象化理解 SpringBoot + SpringCloud
  8. 最好用的JQuery插件集合以及组合拳
  9. 《促进大数据发展行动纲要》发布 部署三大任务助力经济转型
  10. oracle 两表关联查询
  11. Kaminari分页
  12. canvas入门教学(5)运动小球屏保特效与下雪特效渲染
  13. World中利用宏命令批量删除页眉和页脚(亲测好用!)
  14. 树莓派通过API向企业微信推送图文
  15. ADB命令使用大全及使用原理
  16. week11作业——C - 必做题11-3
  17. 投资合伙人股份分配_创业者必看的合伙人股权分配细则
  18. java多行文本框_请问各位大神要怎么把数据库信息显示在多行文本框上
  19. (原创)自编protel99se鼠标增强工具,支持dxp2004
  20. Android Ble 一连多笔记

热门文章

  1. 隋朝之前,扬州指的是现在的南京
  2. linux下安装nginx1.10,Linux(RHEL7.0)下安装Nginx-1.10.2
  3. C++ List的用法(整理)[转载]
  4. sa linux,sa | 搜索结果 | Linux运维部落
  5. 关于mysql性能优化_关键的十个MySQL性能优化技巧
  6. php 两位小数 00,php保存两位小数的几种要领引见_后端开发
  7. C++使用命名管道使用进程间通信
  8. fin.is_open()与fin.open()
  9. 深入理解原型和原型链
  10. 前后端分离,nginx解决跨域问题