题意:

公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第i个通讯中转站需要的成本为Pi(1≤i≤N)。
•另外公司调查得出了所有期望中的用户群,一共M个。关于第i个用户群的信息概括为Ai, Bi和Ci:这些用户会使用中转站Ai和中转站Bi进行通讯,公司可以获益Ci。(1≤i≤M, 1≤Ai, Bi≤N)

•THU集团的CS&T公司可以有选择的建立一些中转站(投入成本),为一些用户提供服务并获得收益(获益之和)。那么如何选择最终建立的中转站才能让公司的净获利最大呢?(净获利 = 获益之和 - 投入成本之和)

解题思路:这道题是《最小割模型在信息学竞赛中的应用》介绍到的“最大获利问题”,详细的证明过程要参看论文。这里只讲建图的思路。

把每个用户和每个站点看成是一个顶点,建立网络,从源点s向每个用户连一条容量为利润的边,每个用户向相关站点连一条容量为无穷大的边,每个站点向汇点连一条容量为成本的边。求出的最小割就是maxflow = (未被选的用户收益之和+被选的站点成本之和),设sum为总收益,我们要求的是(被选的用户收益之和-被选的站点成本之和),刚好等于sum-maxflow。至于原因参看论文。

这里要使用非递归版本的dinic,我的是递归版本的超时了。

TLE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;const int maxn = 60000;
const int inf = 0x3f3f3f3f;
struct Edge
{int to,next,flow;
}edge[maxn<<2];
int n,m,cnt,pre[maxn],layer[maxn];void addedge(int u,int v,int flow)
{edge[cnt].to = v;edge[cnt].flow = flow;edge[cnt].next = pre[u];pre[u] = cnt++;swap(u,v);edge[cnt].to = v;edge[cnt].flow = 0;edge[cnt].next = pre[u];pre[u] = cnt++;
}bool bfs(int s,int t)
{queue<int> q;memset(layer,0,sizeof(layer));layer[s] = 0;q.push(s);while(!q.empty()){int u = q.front();q.pop();if(u == t) return true;for(int i = pre[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(edge[i].flow > 0 && layer[v] == 0){layer[v] = layer[u] + 1;q.push(v);}}}return false;
}int dfs(int u,int t,int maxflow)
{if(u == t) return maxflow;int uflow = 0;for(int i = pre[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(layer[v] == layer[u] + 1 && edge[i].flow > 0){int flow = min(maxflow - uflow,edge[i].flow);flow = dfs(v,t,flow);edge[i].flow -= flow;edge[i^1].flow += flow;uflow += flow;if(uflow == maxflow) break;}}if(uflow == 0)layer[u] = 0;return uflow;
}int dinic(int s,int t)
{int maxflow = 0;while(bfs(s,t) == true)maxflow += dfs(s,t,inf);return maxflow;
}int main()
{int s,t,u,v,w;while(scanf("%d%d",&n,&m)!=EOF){s = 0, t = n + m + 1;cnt = 0;memset(pre,-1,sizeof(pre));for(int i = 1; i <= n; i++){scanf("%d",&w);addedge(i,t,w);}int sum = 0;for(int i = 1; i <= m; i++){scanf("%d%d%d",&u,&v,&w);sum += w;addedge(s,n+i,w);addedge(n+i,u,inf);addedge(n+i,v,inf);}printf("%d\n",sum - dinic(s,t));}return 0;
}

hdu 3879(最小割模型求解最大权闭合图)相关推荐

  1. 洛谷 p4174 [noi2006] 最大获利 最小割(最大流),最大权闭合子图

    题目 题解 题目 洛谷 p4174 建站花费p[i]元,如果a,b两个站都建起来了获利c元,问最大的获利. 题解 首先需要理解最大流求最大权闭合子图,这个我也不说了,又是转载博客. https://b ...

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

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

  3. 二、太空飞行计划问题 [最大权闭合图]

    太空飞行计划问题 问题描述: W教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需 ...

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

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

  5. noi 2006 最大收益 最大权闭合图转最小割转最大流

    题意:一个公司有n个可以建造通讯战的地方,建造成本分别为pi,然后第i个公司会选择使用通讯站ai与bi,使用费用是ci,然后问这个通讯公司怎么建站能够获利最大.(净获利=总收益-总成本): 网上看到一 ...

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

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

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

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

  8. AcWing2279 网络战争 (01分数规划+网络流 最小割模型)

    原题链接:AcWing2279 网络战争 题目大意 给一个无向带权图,求将s和t分开的一个边割集,使得割集的平均边权最小,即最小化∑e∈cwe∣c∣\frac{\sum_{e\in c} w_e}{| ...

  9. 【图论】【网络流】最小割模型

    最小割 最小割应用--01规划问题 最优标号 网络战争 最大权闭合图 最大获利 最大密度子图 生活的艰辛 二分图之最小点权覆盖集 有向图破坏 二分图之最大点权独立集 王者之剑 建图实战 有线电视网络 ...

最新文章

  1. 基于MFC相机采集的实现与采集回调函数的应用实例
  2. ASP.NET学习6 XML文档的操作
  3. 软件工程(2018)第1次团队作业
  4. Vivado设置指定源文件进行RTL优化
  5. C#前后端操作json数据
  6. Jeecg入门篇,高手掠过
  7. Mybatis XML文件如何编写In语句
  8. -6dB的效果也不错
  9. android 设置听筒模式切换,Android开发【06-29视频贴】切换听筒模式部分手机失效,怎么解决?...
  10. 后台定时统计任务太耗时如何优化一下
  11. java反射方法调用_Java反射(3)调用方法
  12. Java基础篇之返回值
  13. mysql删除重复记录只保留一条
  14. unity双面显示shader
  15. Python 爬虫之 Beautifulsoup4,爬网站图片
  16. 计算机课程进制的转换,计算机课程设计 进制转换
  17. 洛谷P3755 [CQOI2017]老C的任务 题解
  18. cad二次开发-线段合并
  19. 数据库查询语句(书上例题)
  20. ssm毕设项目陈氏商城9pd36(java+VUE+Mybatis+Maven+Mysql+sprnig)

热门文章

  1. java期末考试试卷及答案文库_备战期末考!初中全科下册期末试卷(含答案)合集,建议收藏!...
  2. 源码篇:Python 实战案例----银行系统
  3. 微软发布紧急更新:修复Flash高危漏洞
  4. 为什么在定义hashcode时要使用31这个数呢
  5. log-malloc2 0.2.4 发布
  6. 如何发送Head请求
  7. 解决打开WORD错误报告问题
  8. 程序员的七种必备武器
  9. NOCOUNT如何影响ADO.NET(SET NOCOUNT ON的性能问题)
  10. 山重水复疑无路,柳暗花明又一村