[NOI 2006] 最大获利 80分
最后两点怎么搞都要30s+,但是我不会什么优化啊…暂时就这样吧。Dinic的时间复杂度是O(N^2*M)
这题和TDL的幼儿园模板是一样的。
这次写网络流给自己计时了,大约是40min左右,后来都跑去倒腾后面两组数据去了…
program profit;
type ptype=^node;
node=record
v,w,flow:longint;
next:ptype;
end;
const maxn=+;
inf=maxlongint div ;
var head:array[..maxn] of ptype;
visit:array[..maxn] of boolean;
d,q:array[..maxn] of longint;
n,m,i,j,sta,tar,v,a,b,c,cn:longint;
procedure insert(st,ed,r:longint);
var p,q,pre:ptype;
begin
new(p);
p^.v:=ed;p^.w:=r;p^.flow:=;p^.next:=nil;
q:=head[st];
if q=nil then head[st]:=p
else
begin
while q^.next<>nil do q:=q^.next;
q^.next:=p;
end;
end; function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end; function bfs:boolean;
var star,rear,x:longint;
y:ptype;
begin
fillchar(visit,sizeof(visit),false);
fillchar(q,sizeof(q),);
fillchar(d,sizeof(d),);
star:=;rear:=;q[star]:=sta;d[star]:=;visit[sta]:=true;
while star<=rear do
begin
x:=q[star];
y:=head[x];
while y<>nil do
begin
if (not visit[y^.v]) and (y^.w>y^.flow) then
begin
inc(rear);
q[rear]:=y^.v;
visit[y^.v]:=true;
d[y^.v]:=d[x]+;
end;
y:=y^.next;
end;
inc(star);
end;
bfs:=visit[tar];
end; procedure decflow(st,ed,delta:longint);
var y:ptype;
begin
y:=head[st];
while y^.v<>ed do y:=y^.next;
dec(y^.flow,delta);
end; function addflow(p,maxflow:longint):longint;
var y:ptype;
o:longint;
begin
if (p=tar) or (maxflow=) then exit(maxflow);
addflow:=;
y:=head[p];
while y<>nil do
begin
if (d[y^.v]=d[p]+) and (y^.w>y^.flow) then
begin
o:=addflow(y^.v,min(maxflow,y^.w-y^.flow));
if o> then
begin
inc(y^.flow,o);
decflow(y^.v,p,o);
inc(addflow,o);
dec(maxflow,o);
if maxflow= then break;
end;
end;
y:=y^.next;
end;
end; function network:longint;
begin
network:=;
while bfs do
inc(network,addflow(sta,inf));
end; begin
assign(input,'profit9.in');reset(input);
assign(output,'profit9.out');rewrite(output);
readln(n,m);
sta:=;tar:=m+n+;
for i:= to n do
begin
read(v);
insert(m+i,tar,v);
insert(tar,m+i,);
end;
readln;
for i:= to m do
begin
readln(a,b,c);
insert(i,m+a,inf);insert(m+a,i,);
insert(i,m+b,inf);insert(m+b,i,);
insert(sta,i,c);insert(i,sta,);
cn:=cn+c;
end;
writeln(cn-network);
close(input);close(output);
end.
profit
后来写了个优化是我之前自己发明的decflow,现在我在每条边加了一个域op,指向反向边。速度没有什么提升=w=
program profit2;
type ptype=^node;
node=record
v,w,flow:longint;
next,op:ptype;
end;
const maxn=+;
inf=maxlongint div ;
var head:array[..maxn] of ptype;
visit:array[..maxn] of boolean;
d,q:array[..maxn] of longint;
n,m,i,j,sta,tar,v,a,b,c,cn:longint;
procedure insert(st,ed,r1,r2:longint);
var p,q,pre,loc1,loc2:ptype;
begin
new(p);
p^.v:=ed;p^.w:=r1;p^.flow:=;p^.next:=nil;
q:=head[st];
if q=nil then head[st]:=p
else
begin
while q^.next<>nil do q:=q^.next;
q^.next:=p;
end;
loc1:=p;
new(p);
p^.v:=st;p^.w:=r2;p^.flow:=;p^.next:=nil;
q:=head[ed];
if q=nil then head[ed]:=p
else
begin
while q^.next<>nil do q:=q^.next;
q^.next:=p;
end;
loc2:=p;
loc1^.op:=loc2;
loc2^.op:=loc1;
end; function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end; function bfs:boolean;
var star,rear,x:longint;
y:ptype;
begin
fillchar(visit,sizeof(visit),false);
fillchar(q,sizeof(q),);
fillchar(d,sizeof(d),);
star:=;rear:=;q[star]:=sta;d[star]:=;visit[sta]:=true;
while star<=rear do
begin
x:=q[star];
y:=head[x];
while y<>nil do
begin
if (not visit[y^.v]) and (y^.w>y^.flow) then
begin
inc(rear);
q[rear]:=y^.v;
visit[y^.v]:=true;
d[y^.v]:=d[x]+;
end;
y:=y^.next;
end;
inc(star);
end;
bfs:=visit[tar];
end; function addflow(p,maxflow:longint):longint;
var y:ptype;
o:longint;
begin
if (p=tar) or (maxflow=) then exit(maxflow);
addflow:=;
y:=head[p];
while y<>nil do
begin
if (d[y^.v]=d[p]+) and (y^.w>y^.flow) then
begin
o:=addflow(y^.v,min(maxflow,y^.w-y^.flow));
if o> then
begin
inc(y^.flow,o);
dec(y^.op^.flow,o);
inc(addflow,o);
dec(maxflow,o);
if maxflow= then break;
end;
end;
y:=y^.next;
end;
end; function network:longint;
begin
network:=;
while bfs do
inc(network,addflow(sta,inf));
end; begin
assign(input,'profit10.in');reset(input);
assign(output,'profit10.out');rewrite(output);
readln(n,m);
sta:=;tar:=m+n+;
for i:= to n do
begin
read(v);
insert(m+i,tar,v,);
//insert(tar,m+i,);
end;
readln;
for i:= to m do
begin
readln(a,b,c);
insert(i,m+a,inf,);//insert(m+a,i,);
insert(i,m+b,inf,);//insert(m+b,i,);
insert(sta,i,c,);//insert(i,sta,);
cn:=cn+c;
end;
writeln(cn-network);
close(input);close(output);
end.
profit2
[NOI 2006] 最大获利 80分的更多相关文章
- [BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以 ...
- NOIP 2016 天天爱跑步 80分暴力
题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 个结点 ...
- [关于SQL]查询成绩都大于80分的学生
1.用一条SQL语句 查询出每门课都大于80分的学生姓名name kecheng fenshu张三 语文 81张三 数学 75李四 语文 76李四 数学 90王五 语文 81王五 数学 100王五 英 ...
- 用一条SQL语句查出每门课都大于80分的学生的姓名
用一条SQL语句查出每门课都大于80分的学生的姓名,数据表结构如下: 建表SQL如下: ; -- ---------------------------- -- Table structure for ...
- 根据考试成绩输出对应的礼物,90分以上爸爸给买电脑,80分以上爸爸给买手机, 60分以上爸爸请吃一顿大餐,60分以下爸爸给买学习资料。 要求:该题使用多重if完成
package com.Summer_0417.cn; import java.util.Scanner; /** * @author Summer * 根据考试成绩输出对应的礼物, * 90分以上爸 ...
- 案例2:用一条SQL查询出数学语文成绩都大于80分的学生姓名?
方法1: 查出科目成绩有小于80分的学生姓名,再约束并去重学生不等于查出来的姓名 select distinct A.name from t_score A where A.name not in(s ...
- 第一个spring冲刺团队贡献分(80分满分)
团队贡献分(80分满分): 李泳江 24 叶煜稳 26 谢洪跃 18 周伟雄 12
- 【mysql经典题目】科目成绩都大于80分\每个科目的第一名\总成绩排名
参考:http://blog.csdn.net/lifushan123/article/details/44948135 1.查询出科目成绩都大于80分的学生的名字? drop table if EX ...
- SQL查询出每门课都大于80 分的学生姓名
Course表如下: 查询出每门课都大于80 分的学生姓名有两种方法. 1.select distinct name from Course where name not in (select di ...
随机推荐
- NuGet安装及使用教程
Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中添加.移除和更新引 ...
- 下载安装JDK,配置环境变量
Hello,JDK; 在开始学习JAVA之前,第一件事情肯定是被告知:先下载JDK.就像我的一个朋友问我的一样"JDK是个什么鬼?我学的不是JAVA么,为什么要下载JDK?". J ...
- caffe + ubuntu16.04 (version without GPU)
This Guide is based on caffe github wiki guide (https://github.com/BVLC/caffe/wiki/Ubuntu-16.04-or-1 ...
- 把数据输出到Word (非插件形式)
项目开发过程中,我们要把数据以各种各样的形式展现给客户.把数据以文档的形式展现给客户相信是一种比较头疼的问题,如果没有好的方法会 使得我的开发繁琐,而且满足不了客户的需求.接下来我会通过两种开发方式介 ...
- Jmeter 学习(三)
1. 线程组知识 1)Ramp-up period 表示多长时间内建立全部的线程数N 默认为0,表示测试开始即建立全部线程并立即发送访问请求 设置为Ts,表示每隔T/N建立一个线程 注1:一般不设置为 ...
- Error:No suitable device found: no device found for connection "System eth0"
环境描述: Vmware 故障说明: 在克隆几台虚拟机,发现启动后不能配置IP地址等信息,使用linux命令: “ifup eth0”也不能激活网卡, 而在使用"service networ ...
- iOS - iOS 应用
1.Xcode 项目属性 Product Name 软件名称.产品名称.项目名称 Organization Name 公司名称.组织名称 Organization Identifier 公司的唯一标识 ...
- 扒一扒自从买了kindle后看的书
一.<性别战争> 讲述的是动物界各类动物的xxx(你懂的),以动物拟人化的口吻来进行问答,十分的生动形象,虽说和自己的生活没有多大联系,但是偶尔了解一下,也是意外的不错的感觉. 二.< ...
- 妙方之解决matplotlib的图例里的中文呈现小方形
妙方之解决matplotlib的图例里的中文呈现小方形 分析思路: 每个中文都对应地呈现一个小方形, 不多也不少. 不能说是乱码. 应该是matplotlib的默认字库不支持中文造成的. 应对办法: ...
- 命名空间$.fn
$.fn.xxx是可以用对象来调用的命名空间,例如 $.fn.input() 在声明时就可以用 $('abc').input() $.fx是指jquery的特效. 如果使用显示.滑动.淡入淡出. ...