1497: [NOI2006]最大获利

Description

新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战。THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研究、站址勘测、最优化等项目。在前期市场调查和站址勘测之后,公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第i个通讯中转站需要的成本为Pi(1≤i≤N)。另外公司调查得出了所有期望中的用户群,一共M个。关于第i个用户群的信息概括为Ai, Bi和Ci:这些用户会使用中转站Ai和中转站Bi进行通讯,公司可以获益Ci。(1≤i≤M, 1≤Ai, Bi≤N) THU集团的CS&T公司可以有选择的建立一些中转站(投入成本),为一些用户提供服务并获得收益(获益之和)。那么如何选择最终建立的中转站才能让公司的净获利最大呢?(净获利 = 获益之和 - 投入成本之和)

Input

输入文件中第一行有两个正整数N和M 。第二行中有N个整数描述每一个通讯中转站的建立成本,依次为P1, P2, …, PN 。以下M行,第(i + 2)行的三个数Ai, Bi和Ci描述第i个用户群的信息。所有变量的含义可以参见题目描述。

Output

你的程序只要向输出文件输出一个整数,表示公司可以得到的最大净获利。

Sample Input

5 5
1 2 3 4 5
1 2 3
2 3 4
1 3 3
1 4 2
4 5 3

Sample Output

4

HINT

【样例说明

选择建立1、2、3号中转站,则需要投入成本6,获利为10,因此得到最大收益4。

【评分方法】

本题没有部分分,你的程序的输出只有和我们的答案完全一致才能获得满分,否则不得分。

【数据规模和约定】

80%的数据中:N≤200,M≤1 000。

100%的数据中:N≤5 000,M≤50 000,0≤Ci≤100,0≤Pi≤100。


  这道题目是经典的最大权闭合子图。典型做法是(请把“改点”自行脑补成“该点”):

  确实很有道理。忽然想起文理分科,便恍然大悟。最开始可以使用近乎贪心的策略,把所有的正权都容纳入内,再构造一张图,表示出依赖关系,若不割某边,则必割某边。每一次割边都视作一次损失,我们要让损失最小化,并且让图合法化,这就可以用最小割。净获利 = 获益之和 - 投入成本之和,若最开始选了,那么割去则意味着放弃此收益,若最开始没有选,则意味着这是成本,即投入该成本。如果要输出方案,就可以转化为输出最小割的方案,好强啊!反正我不会。

  最后说一句,不知道为什么,N开10^5才能过,不知道是为什么。(否则会RE)

  

 /**************************************************************
Problem: 1497
User: Doggu
Language: C++
Result: Accepted
Time:700 ms
Memory:10196 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <algorithm>
template<class T>inline void readin(T &res) {
static char ch;
while((ch=getchar())<''||ch>'');
res=ch-;
while((ch=getchar())>=''&&ch<='')res=(res<<)+(res<<)+ch-;
}
const int N = ;
const int M = ;
struct Edge {int v,upre,cap,flow;}g[M];
int head[N], ne=-;
inline void adde(int u,int v,int cap) {
g[++ne]=(Edge){v,head[u],cap,},head[u]=ne;
g[++ne]=(Edge){u,head[v],,},head[v]=ne;
} int n, m, s, t; int d[N], cur[N], q[N], front, rear;
bool BFS() {
memset(d, ,sizeof(d));
front=rear=;q[rear++]=s;d[s]=;
while(front!=rear) {
int u=q[front++];
for( int i = head[u]; i != -; i = g[i].upre ) {
int v=g[i].v;
if(!d[v]&&g[i].cap>g[i].flow) q[rear++]=v,d[v]=d[u]+;
}
}
return d[t];
}
int DFS(int u,int a) {
if(u==t||a==) return a;
int flow=, f;
for( int &i = cur[u]; i != -; i = g[i].upre ) {
int v=g[i].v;
if(d[v]==d[u]+&&(f=DFS(v,std::min(a,g[i].cap-g[i].flow)))>) {
flow+=f;a-=f;g[i].flow+=f;g[i^].flow-=f;
if(a==) break;
}
}
if(!flow) d[u]=;
return flow;
}
int maxflow() {
int flow=; while(BFS()) {
memcpy(cur,head,sizeof(head));
flow+=DFS(s,0x3f3f3f3f);
}
return flow;
}
int main() {
memset(head,-,sizeof(head));
readin(n);readin(m);
int x, a, b, c, sum=;
s=n+m+;t=n+m+;
for( int i = ; i <= n; i++ ) {
readin(x);adde(i,t,x);
}
for( int i = ; i <= m; i++ ) {
readin(a);readin(b);readin(c);sum+=c;
adde(n+i,a,0x3f3f3f3f);
adde(n+i,b,0x3f3f3f3f);
adde(s,n+i,c);
}
n=n+m+;
//净获利=获益之和-投入成本之和(要么放弃c要么投入ab)
printf("%d\n",sum-maxflow());
return ;
}

dinic最小割建图

BZOJ 1497 [NOI2006]最大获利的更多相关文章

  1. BZOJ1497: [NOI2006]最大获利[最小割 最大闭合子图]

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4375  Solved: 2142[Submit][Status] ...

  2. bzoj1497: [NOI2006]最大获利(最大权闭合子图)

    1497: [NOI2006]最大获利 题目:传送门 题解: %%%关于最大权闭合子图很好的入门题 简单说一下什么叫最大权闭合子图吧...最简单的解释就是正权边连源点,负权边连汇点(注意把边权改为正数 ...

  3. [bzoj1497][NOI2006]最大获利_网络流_最小割

    最大获利 bzoj-1497 题目大意:可以建立一个点,花费一定的代价:将已经建立的两个点之间连边,得到一定收益.有些节点之间是不允许连边的. 注释:1<=点数<=5,000,1<= ...

  4. Bzoj1497 [NOI2006]最大获利

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4449  Solved: 2181 Description 新的技术正冲击着手机通讯市场,对于各大运营商来 ...

  5. BZOJ1497 [NOI2006]最大获利 网络流 最小割 SAP

    原文链接http://www.cnblogs.com/zhouzhendong/p/8371052.html 题目传送门 - BZOJ1497 题意概括 有n个站要被建立. 建立第i个站的花费为pi. ...

  6. BZOJ1497[NOI2006]最大获利——最大权闭合子图

    题目描述 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成 ...

  7. 【最大权闭合子图】BZOJ1497[NOI2006]-最大获利

    [题目大意] 建立第i个通讯中转站需要的成本为Pi(1≤i≤N).另外公司调查得出了所有期望中的用户群,一共M个.关于第i个用户群的信息概括为Ai, Bi和Ci:这些用户会使用中转站Ai和中转站Bi进 ...

  8. 【最大权闭合子图 最小割】bzoj1497: [NOI2006]最大获利

    最大权闭合子图的模型:今天才发现dinic板子是一直挂的…… Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在 ...

  9. bzoj1497 [NOI2006]最大获利 最大权闭合子图

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1497 思路 最大权闭合子图的裸题 一开始知道是这个最大权闭合子图(虽然我不知道名字),但是我 ...

随机推荐

  1. docker中创建MySQL及在外部使用Navicat连接

    1:获取MySQL镜像 运行 docker pull mysql [root@MyCentos7- ~]# docker pull mysql Using default tag: latest la ...

  2. python中数据分析常用函数整理

    一. apply函数 作用:对 DataFrame 的某行/列应用函数之后,Apply 返回一些值.函数既可以使用默认的,也可以自定义.注意:在第二个输出中应用 head() 函数,因为它包含了很多行 ...

  3. 【Alpha发布】贡献分分配

    最后贡献分分配: (1211)王嘉豪:32 (1186)黄雨萌:36 (1182)佘彦廷:40 (1208)何小松:50 (1200)鲁聃:62 (1174)邢浩:64 (1193)刘乾:66

  4. Python学习二

    list  [ ] Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素 classmates = ['Michael', 'Bob', 'Tracy ...

  5. cnblogs用户体验评价

    1. 是否提供良好的体验给用户(同时提供价值)? 博客园就相当于现在生活中处处可见的微博,所有人都在上面发表自己的一些看法,当然我们比较关注的是计算机编程方面的一些博客,大多数编程人员愿意分享自己的代 ...

  6. 剑指offer:二位数组中的查找

    准备找实习期间,复习一下数据相关内容,刷刷题. 题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样 ...

  7. 《TCP/IP 详解 卷1:协议》第 11 章:名称解析和域名系统

    引言 到目前为止,我们使用 IP 地址来研究参与网络的主机.对于大众来说,这些地址太繁琐且难以记忆.为了使用如 TCP 和 IP 等协议,主机名称通过名为名称解析(name resolution)的过 ...

  8. JAVA之路(二)

    学道酬勤,这是第二次学习JAVA,感觉如醍醐灌顶一样,理解很多思想和道理. 本博只是自己对JAVA的一些理解,具体定义以及用法百科里有. 我为什么在博客园内记录自己的学习过程呢,因为我想有人知道我在学 ...

  9. Java网络编程二:Socket详解

    Socket又称套接字,是连接运行在网络上两个程序间的双向通讯的端点. 一.使用Socket进行网络通信的过程 服务端:服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端的连接 ...

  10. Redis内存回收:LRU算法

    Redis技术交流群481804090 Redis:https://github.com/zwjlpeng/Redis_Deep_Read Redis中采用两种算法进行内存回收,引用计数算法以及LRU ...