Hdu3879 Base Station 最大权闭合子图 最大获利
来源:互联网 发布:古墓丽影崛起帧数优化 编辑:程序博客网 时间:2024/05/18 19:20
题意:
公司得到了一共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向每个用户连接一条容量为收益的有向边,每个用户向相关的两个站点连接一条容量为无穷大的 有向边,每个站点向汇点T连接一条容量为成本的有向边。求出网络最小割集的容量就是Maxflow=(未被选的用户的收益之和 + 被选择的站点的成本之和)。设Total为所有用户的收益之和,我们要求的是(被选的用户的收益之和 – 被选择的站点的成本之和),恰好等于Total – Maxflow,就是最大收益。
为什么是这样的?因为任何一个可行割集对应了一个满足条件的方案,具体来说被选择的顶点就是S集合中的顶点,而割集对应了cut=(未被 选的用户的收益之和 + 被选择的站点的成本之和),我们为了要求的(被选的用户的收益之和 – 被选择的站点的成本之和)= Total – cut尽量大,Total一定,所以要让cut尽量小,直至最小割集。
•本题可以参考:(最大获利)
•:http://judge.noi.cn/problem?id=1142
在胡伯涛论文 《最小割模型在信息学竞赛中的应用》中有详细介绍过这个问题.
•在论文的第四节中,介绍最大密度子图模型.先将其转化为最大闭合图模型解决,又重新提出了一个用最小割模型解决的新方法很好的解决了"最大获利(profit)问题"
最大权闭合图 Maximum Weight Closure of a Graph
•定义一个有向图G = (V, E)的闭合图是该有向图的一个点集,且该点集的所有出边都还指向该点集。即闭合图内的任意点的任意后继也一定在闭合图中。更形式化地说,闭合图是这样的一个点集V'∈V,满足对于∀u∈V'引出的∀<u, v>∈E,必有v∈V'成立。
闭合图的性质
闭合图的性质有恰好反映了事物间的必要条件的关系,一个事件的发生,它说需要的所有前提也都要发生。这就对应着图里面的所有由u引出的边e,在闭合图里u和由u的出边e到达的点v是一个整体,就是说,如果一个闭合图包含了u,就必须也要包含v,但是如果一个闭合图包含了v,却不一定要包含u,只要利用好这种必要关系,就可以很快建图了。
•将每个用户(m)和中转站(n)看作点,另外添加源点s,汇点t,所以所构图中有(n+m+1+1)个点.
•添加下列边:
•①s到用户i,容量为Ci
•②用户i到中转站Ai和Bi,容量为∞
•③中转站i到t,容量为Pi
•考虑这个模型的割
•割边不可能是②中的边,这保证了解的合法性
•属于①的割边表示损失的利益
•属于③的割边表示付出的代价
• 因为最大获益=用户总获益-未选择用户群应得获益-中转站花费=用户总获益-(未选择用户群应得获益+中转站花费)
•显然割的量越小越好,这样这道题就转换成一个最小割的问题
•根据最大流最小割定理,设sum=∑Ci,我们只要求出该网络的最大流maxflow,则sum-maxflow就是最大获利
•对于这个网络流模型,它的最小割的意义就是未选择用户群应得获益+中转站花费.
•这样,只要求出最小切割,然后用用户总获益减去最小切割就可以了.
•
根据最小割最大流定理,求一个最大流,问题解决. #include<iostream> #include<cstdio> #include<memory.h> #include<cmath> using namespace std; #define MAXN 60000 #define MAXE 320000 #define INF 0x3fffffff int ne,nv,tmp,s,t,index; struct Edge{ int next,pair,v; int cap,fLow; }edge[MAXE]; int net[MAXN]; int ISAP() { int numb[MAXN],dist[MAXN],curedge[MAXN],pre[MAXN]; int cur_fLow,max_fLow;int u,tmp,neck,i; memset(dist,0,sizeof(dist)); memset(numb,0,sizeof(numb)); memset(pre,-1,sizeof(pre)); for(i = 1 ; i <= nv ; ++i) curedge[i] = net[i]; numb[nv] = nv; max_fLow = 0; u = s; while(dist[s] < nv) { if(u == t) { cur_fLow = INF+1; for(i = s; i != t;i = edge[curedge[i]].v) { if(cur_fLow > edge[curedge[i]].cap) { neck = i; cur_fLow = edge[curedge[i]].cap; } } for(i = s; i != t; i = edge[curedge[i]].v) { tmp = curedge[i]; edge[tmp].cap -= cur_fLow; edge[tmp].fLow += cur_fLow; tmp = edge[tmp].pair; edge[tmp].cap += cur_fLow; edge[tmp].fLow -= cur_fLow; } max_fLow += cur_fLow; u = neck; } for(i = curedge[u]; i != -1; i = edge[i].next) if(edge[i].cap > 0 && dist[u] == dist[edge[i].v]+1) break; if(i != -1) { curedge[u] = i; pre[edge[i].v] = u; u = edge[i].v; }else{ if(0 == --numb[dist[u]]) break; curedge[u] = net[u]; for(tmp = nv,i = net[u]; i != -1; i = edge[i].next) if(edge[i].cap > 0) tmp = tmp<dist[edge[i].v]?tmp:dist[edge[i].v]; dist[u] = tmp + 1; ++numb[dist[u]]; if(u != s) u = pre[u]; } } return max_fLow; }void addedge(int u,int v,int f){ edge[index].next = net[u]; edge[index].v = v; edge[index].cap = f; edge[index].fLow = 0; edge[index].pair = index+1; net[u] = index++; edge[index].next = net[v]; edge[index].v = u; edge[index].cap = 0; edge[index].fLow = 0; edge[index].pair = index-1; net[v] = index++; } int main() { int i,j,m,n,tmp; int sum; int a,b,c; /*由此,题目转化为在新的图中求一个闭合图,使得其点权最大,即最大权闭合子图由于最小边权是互补的所以用sum-= */ while(scanf("%d%d",&n,&m)!=EOF) { sum=0; index=0; s = 0; t = n+m+1; nv=t+1; memset(net,-1,sizeof(net)); for(i=1;i<=n;i++){scanf("%d",&tmp);addedge(s,i,tmp);}for(i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);sum+=c;//最大获利//n+i代表边的点 addedge(n+i,t,c);addedge(a,n+i,INF);addedge(b,n+i,INF);} int ans=ISAP(); printf("%d\n",sum-ans); } return 0; }
- Hdu3879 Base Station 最大权闭合子图 最大获利
- HDU3879 Base Station 最大权闭合图/最大密度子图 2011 Multi-University Training Contest 5 - Host by BNU
- 【HDU】3879 Base Station 最大权闭合子图
- HDU 3879 Base Station 最大权闭合子图
- 【BZOJ 1497】 [NOI2006]最大获利 最大权闭合子图
- BZOJ 1497: [NOI2006]最大获利 最大权闭合子图
- BZOJ 1497 [NOI2006]最大获利 最大权闭合子图
- NOI 2006 最大获利 (最大权闭合子图)
- [BZOJ1497][NOI2006]最大获利(最大权闭合子图)
- hdu3879 最大权闭合图
- bzoj1497 最大获利 最大权闭合图
- NOI2006 最大获利 (最大权闭合图)
- [NOI2006] 最大获利 (最大权闭合图)
- 【NOI2006T4】最大获利-最大权闭合子图(最大流)
- HDOJ 3879 - Base Station 最大权闭合子图(最小割解决)
- 【BZOJ1497】【codevs1789】最大获利,网络流之最大权闭合子图
- bzoj1497: [NOI2006]最大获利(最大权闭合子图,最小割)
- bzoj 1497: [NOI2006]最大获利-----------算法模板[最大权闭合子图]&省选计划系列
- 一段登录代码
- 关键帧系统的实现(Hermite位置插值+Squad四元数空间的朝向插值)
- 为什么5%的技术人员开发效率是其他95%的20倍?
- 高效率3D图形程序中的骨骼
- Unix传奇
- Hdu3879 Base Station 最大权闭合子图 最大获利
- 如何避免网站出现优化过度
- 黑马程序员_JavaSE基础04 之 循环嵌套 函数重载 数组 内存空间划分
- 基础备忘:多重继承的构造函数和析构函数
- 从100个数中随机选出10个
- 二叉树遍历算法集合(前中后序遍历的递归和非递归算法,层序遍历算法)
- 科技论文格式和写作技巧
- Ogre -- 3DMax导出插件oFusion
- 数学建模的准备