[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 ...
随机推荐
- Download Oracle Forms 6i
To download Oracle Forms Developer 6i from Oracle click this link http://download.oracle.com/otn/nt/ ...
- C#的四种Timer介绍
一.Timer的几个类别 1.System.Threading.Timer 2.System.Timers.Timer 3.System.Windows.Forms.Timer 4.System.Wi ...
- HDU 5968 异或密码
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- Nodejs的安装及配置
1.从Nodejs官网下载安装包,进行安装,是否安装成功,可以从cmd npm去检查,出现如下界面,就表示安装成功 2.打开Webstorm进行配置,(如果安装前打开webstorm了,需要重启web ...
- OpenCV学习笔记(二)——OpenCV环境变量配置
1. 假定电脑上已经安装了VS2010程序,若没有,首先安装vs2010. 下载OpenCV,下载的文件名为"OpenCV-2.3.1-win-superpack". 2. 解 ...
- try-catch
try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }catch(异常类型2 异常的变量名2){ // ...
- //解决validator验证插件多个name相同只验证第一的问题
//解决validator验证插件多个name相同只验证第一的问题 var validatorName = function () { if ($.validator) { $.validator.p ...
- SSH框架总结
首先,SSH是由多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框架的系统从职责 ...
- Python下载进度条
import dialog,e32,appuifw def ru(x):return x.decode('utf8') def qu(): appuifw.note(ru('已取消')) wait.c ...
- C3P0的两种使用方法
方法一: package C3P0; import java.sql.Connection; import java.sql.SQLException; import java.bea ...