HDU 3879 Base Station 最大权闭合图
来源:互联网 发布:网络招标注册流程 编辑:程序博客网 时间:2024/05/16 16:04
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3879
题意:通信公司要建造n个基站,建设每个基站都有一个花费。另外有m个需求,代表如果特定两个地方之间可以通信(既这两个地方都建设了基站),那么将有一定的收入。现在公司想将利润最大化,问最大利润是多少(可以不用建设全部的基站,只保证利润)
思路:最大权闭合子图。把需求看成点,从源点向m个需求连边,容量为收入,从每个基站向汇点连边,容量为建设基站的花费,从每个需求向所需要的基站连边,容量无穷大。最后总收入减去最大流就是答案
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int N = 60010;const int INF = 0x3f3f3f3f;struct edge{ int to, cap, next;}g[N*10];int head[N], pre[N], cur[N], gap[N], level[N];int cnt, nv, cas = 0;void add_edge(int v, int u, int cap){ g[cnt].to = u, g[cnt].cap = cap, g[cnt].next = head[v], head[v] = cnt++; g[cnt].to = v, g[cnt].cap = 0, g[cnt].next = head[u], head[u] = cnt++;}int sap(int s, int t){ memset(level, 0, sizeof level); memset(gap, 0, sizeof gap); memcpy(cur, head, sizeof head); gap[0] = nv; int v = pre[s] = s, flow = 0, aug = INF; while(level[s] < nv) { bool flag = false; for(int &i = cur[v]; i != -1; i = g[i].next) { int u = g[i].to; if(g[i].cap > 0 && level[v] == level[u] + 1) { flag = true; pre[u] = v; v = u; aug = min(aug, g[i].cap); if(v == t) { flow += aug; while(v != s) { v = pre[v]; g[cur[v]].cap -= aug; g[cur[v]^1].cap += aug; } aug = INF; } break; } } if(flag) continue; int minlevel = nv; for(int i = head[v]; i != -1; i = g[i].next) { int u = g[i].to; if(g[i].cap > 0 && minlevel > level[u]) minlevel = level[u], cur[v] = i; } if(--gap[level[v]] == 0) break; level[v] = minlevel + 1; gap[level[v]]++; v = pre[v]; } return flow;}int main(){ int n, m, a, b, c; while(~ scanf("%d%d", &n, &m)) { cnt = 0; memset(head, -1, sizeof head); for(int i = 1; i <= n; i++) { scanf("%d", &a); add_edge(m + i, n + m + 1, a); //每个基站向汇点连边 } int sum = 0; for(int i = 1; i <= m; i++) { scanf("%d%d%d", &a, &b, &c); sum += c; add_edge(0, i, c); //源点和需求连边 add_edge(i, m + a, INF); //需求和所要求的基站连边 add_edge(i, m + b, INF); } nv = n + m + 2; printf("%d\n", sum - sap(0, n + m + 1)); } return 0;}
0 0
- HDU 3879 Base Station(最大权闭合)
- HDU 3879 Base Station 最大权闭合图
- hdu 3879 Base Station 网络流 最大权闭合图
- hdu 3879 Base Station (最大权闭合图)
- 【HDU】3879 Base Station 最大权闭合子图
- HDU 3879 Base Station 最大权闭合子图
- HDU 3879 Base Station 最大权闭合图
- Base Station (hdu 3879 最大权闭合图)
- 最大权闭合图 hdu 3879 Base Station 有模板!
- hdu 3879 Base Station【最大权闭合图】
- HDU 3879 Base Station 最大权闭合图
- HDU 3879 Base Station(最小割---最大权闭合)
- Hdu Base Station (网络流最大权闭合图)
- [最大权闭合图]hdoj 3879:Base Station
- HDU 3879 Base Station 最小割模型 最大权闭合图
- Hdu3879 Base Station 最大权闭合子图 最大获利
- HDOJ 3879 - Base Station 最大权闭合子图(最小割解决)
- hdoj 3879 Base Station 【最小割 之 最大权闭合图】
- 解决eclipse中ctrl无法跟踪函数或变量问题
- C++和C的区别与发展总结
- C++primer plus第7-8章函数笔记
- 性能优化的十个建议
- python dataframe中找出月末日期
- HDU 3879 Base Station 最大权闭合图
- hadoop2.7.2的安装过程
- hdu 5793A Boring Question (打表 + 乘法逆元 + 快速模)
- HDU 5795 A Simple Nim (打表找规律)
- 使用Intent传递自定义对象
- 安卓开发起始页面+引导页+进入主程序
- 分库后的分页处理
- Android开发03_Intent跳转
- Android 高仿微信语音聊天页面高斯模糊效果