[SCOI2007] 修车
属于我的费用流版本终于诞生了!想来还有点小激动呢…看了下模板,之后完全按照自己的想象来写,这样在考场上也不怕啦~
某人说其实费用流就是把Dinic里的BFS换成SPFA,似乎还是比较有道理的,就是addflow要做一些修改,我第一次的错误就是addflow里的循环写成了while pre[x]<>st do,正解是while x<>st do。
既然算法的问题解决了,接下来的问题就是构图的问题——如何根据题目构建对应的网络。这一题的网络非常特殊,甚至被有些OIer评论为“非主流”…我理解别人的构图也花了一些时间…主要某一个点的费用是它对之后排着的顾客的影响。例如x点表示j号员工接手的倒数第k个顾客是顾客i,那么cost[x]=(k-1)*time[i,j],k映射成n-k就成为了我程序里的构图。在考前果断还要对各种构图熟悉一下,希望有时间。
program repair;
type ptype=^node;
node=record
v,w,flow,cost:longint;
next,op:ptype;
end;
const maxn=;
var head,prep:array[..maxn] of ptype;
visit:array[..maxn] of boolean;
q,dis,pre:array[..maxn] of longint;
time:array[..,..] of longint;
n,m,i,j,k,st,ed:longint;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end; procedure insert(u,v,w1,w2,cost:longint);
var p1,p2,q:ptype;
begin
new(p1);
p1^.v:=v;p1^.w:=w1;p1^.flow:=;p1^.cost:=cost;p1^.next:=nil;
q:=head[u];
if q=nil then head[u]:=p1 else
begin
q:=head[u];
head[u]:=p1;
p1^.next:=q;
end;
new(p2);
p2^.v:=u;p2^.w:=w2;p2^.flow:=;p2^.cost:=-cost;p2^.next:=nil;
q:=head[v];
if q=nil then head[v]:=p2 else
begin
q:=head[v];
head[v]:=p2;
p2^.next:=q;
end;
p1^.op:=p2;p2^.op:=p1;
end; function spfa:boolean;
var star,rear,x:longint;
y:ptype;
begin
fillchar(q,sizeof(q),);
fillchar(pre,sizeof(pre),);
fillchar(visit,sizeof(visit),false);
fillchar(dis,sizeof(dis),$7f);
star:=;rear:=;q[star]:=st;visit[st]:=true;dis[st]:=;
while star<=rear do
begin
x:=q[star];
y:=head[x];
while y<>nil do
begin
if (dis[y^.v]>dis[x]+y^.cost) and (y^.w>y^.flow) then
begin
dis[y^.v]:=dis[x]+y^.cost;
pre[y^.v]:=x;
prep[y^.v]:=y;
if not visit[y^.v] then
begin
inc(rear);
q[rear]:=y^.v;
visit[y^.v]:=true;
end;
end;
y:=y^.next;
end;
visit[x]:=false;
inc(star);
end;
spfa:=not (dis[ed]=);
end; function addcost:longint;
var x,addflow:longint;
y:ptype;
begin
x:=ed;
addflow:=maxlongint;
while x<>st do
begin
y:=prep[x];
addflow:=min(addflow,y^.w-y^.flow);
x:=pre[x];
end;
x:=ed;
while x<>st do
begin
y:=prep[x];
inc(y^.flow,addflow);
dec(y^.op^.flow,addflow);
x:=pre[x];
end;
addcost:=addflow*dis[ed];
end; function mincost:longint;
begin
mincost:=;
while spfa do inc(mincost,addcost);
end; begin
//assign(input,'repair.in');reset(input);
//assign(output,'repair.out');rewrite(output);
readln(m,n);
st:=;ed:=n+n*m+;
for i:= to n do
for j:= to m do
read(time[i,j]);
for i:= to n do
insert(st,i,,,);
for i:=n+n*m downto n+ do
insert(i,ed,,,);
for i:= to n do
for j:= to m do
for k:= to n do
insert(i,j*n+k,,,(n-k+)*time[i,j]);
writeln(mincost/n::);
//close(input);close(output);
end.
repair
本题也是BZOJ 1070
啊啊啊还有2天就要坐灰机了,说来时间真的不多了。简单列一下还要复习的东西吧:树状数组/线段树,Splay(Ex.Cashier),KMP,Tarjan相关,并查集,二分匹配相关……好像也没时间搞别的了?~TAT~
[SCOI2007] 修车的更多相关文章
- BZOJ 1070: [SCOI2007]修车 [最小费用最大流]
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 4936 Solved: 2032[Submit][Status] ...
- 【BZOJ】1070: [SCOI2007]修车
1070: [SCOI2007]修车 Description 同 一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需 ...
- bzoj 1070: [SCOI2007]修车 费用流
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2785 Solved: 1110[Submit][Status] ...
- bzoj 1070 [SCOI2007]修车(最小费用最大流)
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3515 Solved: 1411[Submit][Status] ...
- BZOJ_1070_[SCOI2007]修车_费用流
BZOJ_1070_[SCOI2007]修车_费用流 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间 ...
- P2053 [SCOI2007]修车(费用流)
P2053 [SCOI2007]修车 顾客平均等待的最小时间$=$等待总时间$/n$ 考虑只有1个技术人员时,$n$辆车等待总时间 $A_1+(A_1+A_2)+(A_1+A_2+A_3)+...+\ ...
- [SCOI2007]修车(建图好题)
[SCOI2007]修车 https://www.lydsy.com/JudgeOnline/problem.php?id=1070 Time Limit: 1 Sec Memory Limit: ...
- 【BZOJ1070】[SCOI2007]修车
[BZOJ1070][SCOI2007]修车 题面 以后要多写题面flag 题目描述 同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心.维修中心共有\(M\)位技术人员,不同的技术人员对不同 ...
- 洛谷 P2053 [SCOI2007]修车 解题报告
P2053 [SCOI2007]修车 题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术 ...
- 【BZOJ1070】[SCOI2007]修车 费用流
[BZOJ1070][SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的. ...
随机推荐
- oracle更改用户名
例如,用户名test1改为test2,在plsql界面中不支持直接更改,只能通过sql更改 1.查询系统user$中的user#值 select user#,name from user$ where ...
- ajax局部刷新
//5秒刷新一次 $(function () { setInterval(Refresh, 5000); }); //ajax局部刷新 function Refresh() { $.ajax({ ty ...
- img和css背景的选择
在什么情况下更适合使用HTML IMG标签来显示一个图像,而不是一个CSS有背景图像,反之亦然? 如下场景使用img标签比较合适: 1.如果图像是等内容的一部分或图表或人(真正的人,而不是股票图人), ...
- sql 查看某用户的连接数 以及 如何删除该用户的会话
--查看不同用户的连接数 select TERMINAL from v$session where username='username' and machine='machine' ---查询用户会 ...
- (原创)提取Xilinx开发工具的迅雷下载地址
①进入Xilinx官网,进入Device->Design Tools,选择你想要下载的任意工具. ②进入新web页面,右方点击“Downloads”.③进入版本选择页面,选择想要的版本号,点击相 ...
- antd 学习
1,react中文文档http://reactjs.cn/react/docs/thinking-in-react-zh-CN.html 2,antd文档 https://ant.design/doc ...
- win7 32位安装php redis驱动
根据php版本下载php_redis扩展,然后把php_redis.dll这个扩展文件放到php中的ext文件夹中,然后再去php-ini中添加一行代码:extension=php_redis.dll ...
- git hub
如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:git stashgit pullgit stash pop然后可以使用git diff -w +文件名 来确认代码自动合并的情况 ...
- App开发三种模式
APP开发三种模式 现在App开发的模式包含以下三种: Native App 原生开发AppWeb App 网页AppHybrid App 混合原生和Web技术开发的App 详细介绍: http:// ...
- asp.net Lodop实现批量打印
1.列表(前台) <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="w_stu ...