hdu 3879(最小割模型求解最大权闭合图)
来源:互联网 发布:弹弹安卓版吉他软件 编辑:程序博客网 时间:2024/05/30 04:30
题意:
公司得到了一共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;}
0 0
- hdu 3879(最小割模型求解最大权闭合图)
- HDU 3879 Base Station 最小割模型 最大权闭合图
- 网络流-最大权闭合图(最小割求解)
- HDU 3917 Road constructions 最小割模型最大权闭合图
- HDU 3879 Base Station(最小割---最大权闭合)
- HDU 3061 Battle(最小割----最大权闭合图)
- HDU 5772 (最大权闭合图 最小割)
- HDU 5855-最大权闭合图(-最小割应用)
- pku2987 最小割,最大权闭合图
- 最小割---最大权闭合图简介
- poj 2987(最大权闭合图)最小割求解:关键是思路
- HDU 3917 Road constructions(最小割---最大权闭合)
- HDU 3996 Gold Mine(最小割---最大权闭合)
- 最小割模型——最大权闭合子图 【NOI2006】bzoj1497 最大获利
- HDU 4971 A simple brute force problem.(最小割,最大权闭合图)
- HDU 4971 A simple brute force problem.(最小割,最大权闭合图)
- POJ 2987 最大流最小割最大权闭合图
- POJ 2987 Firing (最大权闭合图,最小割)
- Easy-题目54:234. Palindrome Linked List
- 虚表解析以及构造函数为什么不能是虚函数
- JAVA学习笔记整理四(异常处理)
- java int 与byte互转(转)
- 点击元素使其在毫秒内从不透明变为透明
- hdu 3879(最小割模型求解最大权闭合图)
- 抽象
- Easy-题目55:67. Add Binary
- 整理有关javaScript的知识3
- Foundation之时间格式
- [bzoj2818]gcd
- hdu-2035-人见人爱A^B-数的快速幂
- 接口
- OpenCV学习Laplacian 变换及其运用