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

限制它的金矿,问最多可以获得多少价值。

分析: 比较明显的最大闭合权图。

建图:

如果某个金矿的开发利润为正值,就在源点和该点之间连一条容量为该利润的边

如果某个金矿的开发利润为负值,就在该点和汇点之间连一条容量为该利润绝对值的边

如果某个金矿收到另一个金矿的限制,就在两个金矿之间连一条容量为INF的边。

累计所有正值利润的和  sum,获得的最大利润为sum - maxflow

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<climits>
#define min(a,b)(a)<(b)?(a):(b)
const long long INF=1LL<<60;
const long long maxn=60000;
const long long maxm=2000005;
struct node
{long long from,to,next,c;
}e[maxm];
long long tot;
long long head[maxn];
void add(long long s,long long u,long long f1,long long f2)
{e[tot].from=s;e[tot].to=u;e[tot].c=f1;e[tot].next=head[s];head[s]=tot++;e[tot].from=u;e[tot].to=s;e[tot].c=f2;e[tot].next=head[u];head[u]=tot++;
}
long long q[maxn];
long long cnt[maxn];
long long d[maxn];
long long low[maxn];
long long cur[maxn];
long long maxflow(long long s,long long t,long long n)
{long long *front=q,*rear=q;for(long long i=1;i<=n;i++){d[i]=n;cnt[i]=0;}cnt[n]=n-1;cnt[0]++;d[t]=0;*rear++=t;while(front<rear){long long v=*front++;for(long long i=head[v];i!=-1;i=e[i].next){if(d[e[i].to]==n&&e[i^1].c>0){d[e[i].to]=d[v]+1;cnt[n]--;cnt[d[e[i].to]]++;*rear++=e[i].to;}}}long long  u=s, top=0;long long flow=0;low[0]=INF;for(long long i=1;i<=n;i++)cur[i]=head[i];while(d[s]<n){long long &i=cur[u];for(;i!=-1;i=e[i].next){if(e[i].c>0&&d[u]==d[e[i].to]+1){low[top+1]=min(low[top],e[i].c);q[++top]=i;u=e[i].to;break;}}if(i!=-1){if(u==t){long long minf=low[top];for(long long p=1,i;p<=top;++p){i=q[p];e[i].c-=minf;e[i^1].c+=minf;}flow+=minf;u=s;low[0]=INF;top=0;}}else{long long old_du=d[u];cnt[old_du]--;d[u]=n-1;for(long long i=head[u];i!=-1;i=e[i].next)if(e[i].c>0&&d[u]>d[e[i].to])d[u]=d[e[i].to];cnt[++d[u]]++;if(d[u]<n)cur[u]=head[u];if(u!=s){u=e[q[top]].from;--top;}if(cnt[old_du]==0)break;}}return flow;
}
int g[105][33];
int main()
{long long i,t,n,m,ca=1,tt,j,id;long long sum;scanf("%I64d",&t);while(t--){scanf("%I64d",&n);id=2;memset(head,-1,sizeof(head));memset(g,0,sizeof(g));tt=0;tot=0;sum=0;long long st,en;st=1;en=2;for(i=1;i<=n;i++){scanf("%I64d",&m);tt+=m;for(j=1;j<=m;j++){long long cost,va;long long w;scanf("%I64d%I64d%I64d",&cost,&va,&w);if(!g[i][j])g[i][j]=++id;va-=cost;if(va>0){add(st,g[i][j],va,0);sum+=va;}else add(g[i][j],en,-va,0);while(w--){long long a,b;scanf("%I64d%I64d",&a,&b);if(!g[a][b])g[a][b]=++id;add(g[i][j],g[a][b],INF,0);}}}printf("Case #%I64d: ",ca++);printf("%I64d\n",sum-maxflow(st,en,id));}return 0;
}

转载于:https://www.cnblogs.com/dream-wind/archive/2012/09/11/2680543.html

HDU 3996 Gold Mine【最大闭合权图】相关推荐

  1. java克鲁斯卡尔算法_Java语言基于无向有权图实现克鲁斯卡尔算法代码示例

    所谓有权图,就是图中的每一条边上都会有相应的一个或一组值.通常情况下,这个值只是一个数字 如:在交通运输网中,边上的权值可能表示的是路程,也可能表示的是运输费用(显然二者都是数字).不过,边上的权值也 ...

  2. 数据结构——图-有向带权图的邻接表

    #include <stdio.h> #include <stdlib.h> #define VertexType char //顶点的数据类型(char) #define V ...

  3. 数据结构——图-有向带权图的邻接表基础

    #include <stdio.h> #include <stdlib.h> #define VertexType char //顶点的数据类型(char) #define V ...

  4. java无权图求最短路径_求有权图和无权图的最短路径

    无权图的最短路径 思路:无权图的最短路径也就是要求两点之间最少几跳可达,那么我们可以这样,用广度遍历,从起点开始一层层遍历,如果第一次遍历到终点,那么肯定是最短路径. public static vo ...

  5. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

  6. 深度优先算法解决有向有权图的最短路径问题

    从城市1到城市到城市3有很多条路,每条路的路况各不相同,所耗费的时间都标记在了箭头上,现在需要找出从1到3的最短路径. 有向图:意思是来回的路径值可以是不一样的 有权图:意思是每套路径的值可以是不一样 ...

  7. 有向有权图的电阻------给你出道题

    有向图包括无向图,无向图是特殊的有向图(无向图中一条无向边相当于有向图中两条有向边). 无权图是特殊的有权图(无权图相当于将有权图各条边的权值视作相等). 给定有向图图G,指明N个起始节点,M个终止结 ...

  8. 实现有向带权图抽象数据类型

    题目 图是一种使用广泛的数据结构.本次实验要求设计有向带权图的抽象数据类型,实现图的构造.顶点的增删查,边的增删改.深度优先遍历与广度优先遍历.单源最短路径.多源最短路径.判断图中是否存在负环. 效果 ...

  9. 【算法设计与分析】分支限界法解决单源最短路径问题:输入带权图G=(V,E)以及出发顶点s,然后用分支限界法解决问题,要求输出路径和长度以及计算时间;

    目的: 1.掌握分支限界法的基本思想: 2.掌握解决单源最短路径问题的分支限界法实现方法: 3.学会分析算法的时间复杂度: 4.学会用分支限界法解决实际问题. 要求: 1.输入带权图G=(V,E)以及 ...

  10. Java数据结构与算法:无向图,有向图,带权图,图的遍历,最小生成树

    文章目录 无向图 有向图 带权图 图的遍历 广度优先遍历 深度优先遍历 最小生成树 无向图 前面了解到树是有单一根结点的非线性结构,图(graph)也是一种非线性结构,其中的结点可以与许多其他的结点相 ...

最新文章

  1. LaTeX 表格旋转的设置
  2. Unix/Linux中Cron的用法
  3. 升级Win10后windows.old删除
  4. Chapter34 创建主窗口/实现应用程序功能
  5. nn.BCELoss与nn.CrossEntropyLoss的区别
  6. Boost:基于Boost的异步TCP回显服务器
  7. em oracle 安装,oracle-EM安装
  8. [vue] vue怎么改变插入模板的分隔符?
  9. 并发-阻塞队列源码分析
  10. windows下的IO模型之完成端口
  11. 搭建html5的,HTML5 - 搭建移动Web应用
  12. highlighting v5.0插件使用 一(持续更新)
  13. 伊斯兰教历的计算和各个月的名称
  14. 【Git】解决Untracked Files Prevent Checkout的问题
  15. hihocoder1251Uvalive7263 Today Is a Rainy Day 2015北京赛区C
  16. WIN10系统安装虚拟机以及CentOS7
  17. 商业价值(PgMP)
  18. Latex在论文中输出微米和cm-1
  19. 吉时利Keithley软件2600系列2611B|2612B|2614B|2634B NS-SourceMeter源表软件
  20. 2016五大白马和黑马fund经理

热门文章

  1. 遥感数字图像处理 初体验
  2. JS学习总结(2)——变量
  3. Java微信消息推送(二)
  4. java+editor类_GLIPS Graffiti editor
  5. 实习成长之路——设计模式四:什么是单一职责原则,如何判定某个类的职责是否够“单一”?
  6. highcharts绘制统计图的应用
  7. easyx按钮透明度特效_【素材】100组4K灰尘粒子烟雾特效
  8. 在阿里巴巴如何管理代码分支?
  9. LeakCanary的原理,你知道么?
  10. python加入小学课本_Python走进小学教材