1497: [NOI2006]最大获利

Time Limit: 5 Sec  Memory Limit: 64 MB

Submit: 3437  Solved: 1674

[

id=1497" style="color:blue; text-decoration:none">Submit][

id=1497" style="color:blue; text-decoration:none">Status][Discuss]

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。

Source

最小割的应用

先定义s割为选。t割为不选。

我们能够先将全部收益加起来,再减去最小代价,即为终于答案。

从源点s到全部用户节点i连边(s,i,c[i]),表示假设用户i不能满足,就会付出c[i]的代价。

从全部中转站节点i到汇点t连边(i,t,p[i]),表示假设要建立中转站i。就要付出p[i]的代价。

然后考虑用户对中转站的要求,两个中转站中仅仅要有一个没有,这个用户就不能满足,即仅仅要有一个中转站属于t割,那该用户也属于t割。仅仅要连边(i,a[i],inf)和(i,b[i],inf),由于长度为inf的边是一定不会成为割的。这种方法非常巧妙。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define pa pair<int,int>
#define maxn 60000
#define maxm 320000
#define inf 1000000000
using namespace std;
struct edge_type
{
int next,to,v;
}e[maxm];
int head[maxn],cur[maxn],dis[maxn];
int n,m,s,t,cnt=1,ans=0,x,y,z;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void add_edge(int x,int y,int v)
{
e[++cnt]=(edge_type){head[x],y,v};head[x]=cnt;
e[++cnt]=(edge_type){head[y],x,0};head[y]=cnt;
}
inline bool bfs()
{
queue<int>q;
memset(dis,-1,sizeof(dis));
dis[s]=0;q.push(s);
while(!q.empty())
{
int tmp=q.front();q.pop();
if (tmp==t) return true;
for(int i=head[tmp];i;i=e[i].next) if (e[i].v&&dis[e[i].to]==-1)
{
dis[e[i].to]=dis[tmp]+1;
q.push(e[i].to);
}
}
return false;
}
inline int dfs(int x,int f)
{
int tmp,sum=0;
if (x==t) return f;
for(int &i=cur[x];i;i=e[i].next)
{
int y=e[i].to;
if (e[i].v&&dis[y]==dis[x]+1)
{
tmp=dfs(y,min(f-sum,e[i].v));
e[i].v-=tmp;e[i^1].v+=tmp;sum+=tmp;
if (sum==f) return sum;
}
}
if (!sum) dis[x]=-1;
return sum;
}
inline void dinic()
{
while (bfs())
{
F(i,1,t) cur[i]=head[i];
ans-=dfs(s,inf);
}
}
int main()
{
n=read();m=read();
s=n+m+1;t=s+1;
F(i,1,n)
{
z=read();
add_edge(i+m,t,z);
}
F(i,1,m)
{
x=read();y=read();z=read();
ans+=z;
add_edge(s,i,z);
add_edge(i,x+m,inf);
add_edge(i,y+m,inf);
}
dinic();
printf("%d\n",ans);
}

bzoj1497【NOI2006】最大获利的更多相关文章

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

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

  2. BZOJ 1497 [NOI2006]最大获利

    1497: [NOI2006]最大获利 Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前 ...

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

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

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

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

  5. Bzoj1497 [NOI2006]最大获利

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. python web开发 编写web框架

    参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143233900 ...

  2. [luogu] P4551 最长异或路径(贪心)

    P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 ...

  3. MySql的replace into 语句

    MySQL REPLACE语句介绍 MySQL的REPLACE语句是一个MySQL扩展于SQL标准的语句. 官方定义:REPLACE works exactly like INSERT, except ...

  4. [Angular] Set Metadata in HTTP Headers with Angular HttpHeaders

    Besides sending (or requesting) the actual data to the server API, there’s also often the need to se ...

  5. Google Maps API 将开始收费

    Google Maps API 将开始收费 一.总结 一句话总结:国外的话openstreetmap或许不错 国内的话就高德吧 二.Google Maps API 将开始收费 曾经免费的 Google ...

  6. Oracle RAC 实施

    第 1 步 — 确定项目范围 理由 我们实施 Oracle RAC 是为了使我们的应用程序可伸缩和高度可用,以及为我们的客户提供更可靠的服务. 目标/可交付产品 该项目的最终产品将是一个新的 Orac ...

  7. correct ways to define variables in python

    http://stackoverflow.com/questions/9056957/correct-way-to-define-class-variables-in-python later say ...

  8. Java获取环境变量和系统属性

    Java获取服务器环境变量和JVM系统变量    当程序中需要使用与操作系统相关的变量(例如:文件分隔符.换行符)时,Java提供了System类的静态方法getenv()和getProperty() ...

  9. Android ViewPager+属性动画 实现炫酷视差动画效果

    ViewPager有一个setPageTransform()方法可以实现很多酷炫的动画效果 先来个仿QQ的侧滑面板效果 vp.setPageTransformer(true, new PageTran ...

  10. Java数据库连接——jdbc-odbc桥连接方式及汉字乱码问题

    jdbc-odbc桥连接方式操作数据库SU(Course),其中Course属性有Cno,Cname,Cpno,Ccredit. 步骤: 1.配置数据源 控制面板下搜索管理工具->ODBC数据源 ...