bzoj1497
这道题让我涨姿势了
对于这类问题,我们称作最大权闭合图问题
就是每个点都有一个点权,要求选择一个点集,其中每个点的指向的点也在点集中,使这样一个点权和最大
对于这种问题,我们添加源点s,汇点t
对于点i,如果点权w是正的,我们连边s--->i,流量为w
如果点权w是负的,我们连边i--->t,流量为-w
然后我们我们原图中所有边流量设为inf即可
最后的答案=正点权和-最小割(最大流)
对于这道题,我们把用户和中转站看成点,
对于每个用户,我们显然要由它指向对应的两个中转站,然后做最大权闭合图即可
但是,这样做会tle,
分析一下,为什么呢?因为有多达50000个用户
再仔细观察题目,一共最多只有5000个中转站,
我们知道,最大流的效率取决于找增广路的效率
对于这幅图,我们不难发现,瓶颈边更容易出现在中转站一边
于是我们可以反向建图,这不改变网络的最小割,并且能大大减少增广的次数
反向建图是一个很重要的优化方法
const inf=;
type node=record
next,flow,point:longint;
end; var edge:array[..] of node;
p,h,numh,cur,pre:array[..] of longint;
n,m,i,j,t,x,y,z,len,s:longint; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; procedure add(x,y,f:longint);
begin
inc(len);
edge[len].point:=y;
edge[len].flow:=f;
edge[len].next:=p[x];
p[x]:=len;
end; function sap:longint;
var u,i,j,q,neck,tmp,s:longint;
begin
u:=;
numh[]:=t+;
sap:=;
while h[]<t+ do
begin
if u=t then
begin
neck:=inf;
i:=;
while i<>t do
begin
j:=cur[i];
if neck>edge[j].flow then
begin
neck:=edge[j].flow;
s:=i;
end;
i:=edge[j].point;
end;
i:=;
while i<>t do
begin
j:=cur[i];
dec(edge[j].flow,neck);
inc(edge[j xor ].flow,neck);
i:=edge[j].point;
end;
sap:=sap+neck;
u:=s;
end;
q:=-;
i:=p[u];
while i<>- do
begin
j:=edge[i].point;
if (edge[i].flow>) and (h[u]=h[j]+) then
begin
q:=i;
break;
end;
i:=edge[i].next;
end;
if q<>- then
begin
cur[u]:=i;
pre[j]:=u;
u:=j;
end
else begin
dec(numh[h[u]]);
if numh[h[u]]= then exit;
tmp:=t+;
i:=p[u];
while i<>- do
begin
j:=edge[i].point;
if edge[i].flow> then tmp:=min(tmp,h[j]);
i:=edge[i].next;
end;
h[u]:=tmp+;
inc(numh[h[u]]);
if u<> then u:=pre[u];
end;
end;
end; begin
readln(n,m);
t:=n+m+;
len:=-;
fillchar(p,sizeof(p),);
for i:= to n do
begin
read(x);
add(,i,x);
add(i,,);
end;
for i:= to m do
begin
readln(x,y,z);
s:=s+z;
add(n+i,t,z);
add(t,n+i,);
add(x,n+i,inf);
add(n+i,x,);
add(y,n+i,inf);
add(n+i,y,);
end;
writeln(s-sap);
end.
bzoj1497的更多相关文章
- 【bzoj1497】 NOI2006—最大获利
http://www.lydsy.com/JudgeOnline/problem.php?id=1497 (题目链接) 题意 给出一个图,每一个点有一个负点权,每一条边有一个边权.选择某一条边的前提是 ...
- [bzoj1497][NOI2006]最大获利_网络流_最小割
最大获利 bzoj-1497 题目大意:可以建立一个点,花费一定的代价:将已经建立的两个点之间连边,得到一定收益.有些节点之间是不允许连边的. 注释:1<=点数<=5,000,1<= ...
- BZOJ1497 [NOI2006]最大获利 网络流 最小割 SAP
原文链接http://www.cnblogs.com/zhouzhendong/p/8371052.html 题目传送门 - BZOJ1497 题意概括 有n个站要被建立. 建立第i个站的花费为pi. ...
- 【BZOJ1497】【NOI2006】最大获利(网络流)
[BZOJ1497][NOI2006]最大获利(网络流) 题面 BZOJ Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS& ...
- 【BZOJ1497】[NOI2006]最大获利 最小割
裸的最小割,很经典的模型. 建图:要求总收益-总成本最大,那么将每条弧与源点相连,流量为成本,每个收益与汇点相连,流量为收益,然后每条弧与它所能到达的收益相连,流量为inf. 与源点相连的是未被选中的 ...
- BZOJ1497: [NOI2006]最大获利[最小割 最大闭合子图]
1497: [NOI2006]最大获利 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 4375 Solved: 2142[Submit][Status] ...
- 【BZOJ-1497】最大获利 最大流
1497: [NOI2006]最大获利 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 3800 Solved: 1848[Submit][Status] ...
- Bzoj1497 [NOI2006]最大获利
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 4449 Solved: 2181 Description 新的技术正冲击着手机通讯市场,对于各大运营商来 ...
- bzoj1497(最小割)
传送门:最大获利 题意:建立n个中转站,每个花费P[i],有m个用户,使用Ai和Bi中转站可获利Ci,问最终建立哪几个中转站使获利最大? 分析:根据最大权闭合图建图,用户群和中转站为带权的点集,用户群 ...
随机推荐
- textLayout在快速输入清除时报错解决方法
var tf:TextFlow; var len:int = tf.numChildren;for (var i:int = 0; i < len; i += 1){ tf.removeChil ...
- angular2 select change 事件
刚开始这是啥?(wrong!!! change事件会在 选择option行为 之前执行prodDirId,是取不到选择后正确的id值的,取得是选择行为前prodDirId的值(有试过setTi ...
- HDU 1087 Super Jumping! Jumping! Jumping!(动态规划)
Super Jumping! Jumping! Jumping! Problem Description Nowadays, a kind of chess game called “Super Ju ...
- 嵌入式系统关机/Embeded System PowerOff HowTo?
REFER: 嵌入式Linux实现关机命令 REFER: Embedded File System and power-off REFER: kernel/reboot.c REFER: PowerO ...
- day20 在php中通过php语句操作数据库
第一步:连接数据库服务器 mysql_connect("数据库服务器地址","用户名","密码") 第二步:设定跟数据库打交道的网页的编码 ...
- Linux查找软件的安装路径
软件安装的路径可能不止一个,可以使用whereis命令查看软件安装的所有路径,以mysql为例: whereis mysql 该命令会返回软件的所有安装路径: mysql: /usr/bin/mysq ...
- ajax返回json处理
在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. (一)以jquery异步获取的数据类型--json ...
- 《Nodejs开发加密货币》之二十七:开发通用的HTML组件
人的懒惰常常是麻烦的开始.多数程序员都希望自己的工作一劳永逸,一次开发,到处使用,成了人人追逐的目标,我也不例外.最初写<Nodejs开发加密货币>系列文章,因为不喜欢设定好了去写,所以目 ...
- PS学习笔记
PS学习笔记 常用快捷键 快捷键 功能 Ctrl+T 自由变换 Ctrl+Alt+Shift+T 复制图层+再次变换 Alt+Del 以前景色填充 Ctrl+Del 以背景色填充 Ctrl+I 反相 ...
- DB2实用命令记录
quiesce tablespace quiesce tablespaces for table <table_name> share; Monitor Switches details ...