bzoj1070
平均时间最短即总时间最短
首先不难想到,将每个工作人员拆成n个点
然后,我就卡住了,
的确,正向建图确实很难,因为我们不好表示在修第i个车之前,前面用了多少时间
于是我们应该逆向想一想,将这辆车作为某个工作人员倒数第k个修的车会对之后的时间做怎样的影响
显然,每个工作人员修车是相对独立的
也就是说,工作人员i倒数第k个修车j时对后续他修的车时间影响总和是time[i,j]*k
于是,每个工作人员拆成的n个点意义就明确了;
图就好建了;
当然,这是一个二分图,可以KM,可以最小费用最大流,
作为不会KM的弱渣,我就用最小费用最大流吧
const inf=;
type node=record
next,flow,cost,from,point:longint;
end;
var edge:array[..] of node;
q:array[..] of longint;
a:array[..,..] of longint;
pre,d,p:array[..] of longint;
v:array[..] of boolean;
ans,len,t,n,m,x,i,j,k:longint; procedure add(x,y,f,w:longint);
begin
inc(len);
edge[len].from:=x;
edge[len].point:=y;
edge[len].flow:=f;
edge[len].cost:=w;
edge[len].next:=p[x];
p[x]:=len;
end; function spfa:boolean;
var f,r,x,y,i:longint;
begin
for i:= to t do
d[i]:=inf;
d[]:=;
fillchar(v,sizeof(v),false);
v[]:=true;
f:=;
r:=;
q[]:=;
while f<=r do
begin
x:=q[f];
v[x]:=false;
i:=p[x];
while i<>- do
begin
y:=edge[i].point;
if edge[i].flow> then
begin
if d[y]>d[x]+edge[i].cost then
begin
d[y]:=d[x]+edge[i].cost;
pre[y]:=i;
if not v[y] then
begin
v[y]:=true;
inc(r);
q[r]:=y;
end;
end;
end;
i:=edge[i].next;
end;
inc(f);
end;
if d[t]>=inf then exit(false) else exit(true);
end; procedure mincost;
var i,j:longint;
begin
while spfa do
begin
i:=t;
while i<> do
begin
j:=pre[i];
dec(edge[j].flow);
inc(edge[j xor ].flow);
i:=edge[j].from;
end;
ans:=ans+d[t];
end;
end; begin
readln(m,n);
len:=-;
fillchar(p,sizeof(p),);
for i:= to n do
begin
for j:= to m do
read(a[i,j]);
readln;
end;
for i:= to n do
begin
add(,m*n+i,,);
add(m*n+i,,,);
end;
t:=m*n+n+;
for i:= to m do
begin
for j:= to n do
begin
add((j-)*m+i,t,,);
add(t,(j-)*m+i,,);
end;
for j:= to n do
for k:= to n do
begin
x:=a[j,i]*(n-k+);
add(j+m*n,i+(k-)*m,,x);
add(i+(k-)*m,j+m*n,,-x);
end;
end;
mincost;
writeln(ans/n::);
end.
bzoj1070的更多相关文章
- bzoj1070 修车&& bzoj2879美食节 【费用流】
bzoj1070: 把每个工人拆成汽车那么多个点,假如说 工人(i, j) 和 汽车k 连边,那就代表第i个工人倒数第j个修汽车k,那么这条边对以后的贡献就是k*time[i修k]. #include ...
- 【BZOJ1070】[SCOI2007]修车
[BZOJ1070][SCOI2007]修车 题面 以后要多写题面flag 题目描述 同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心.维修中心共有\(M\)位技术人员,不同的技术人员对不同 ...
- 【BZOJ1070】[SCOI2007]修车 费用流
[BZOJ1070][SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的. ...
- 【BZOJ1070】修车(费用流)
题意:同一时刻有N位车主带着他们的爱车来到了汽车维修中心. 维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的. 现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...
- [bzoj1070][SCOI2007]修车_费用流
修车 bzoj-1070 SCOI-2007 题目大意:有m个人要修n台车,每个工人修不同的车的时间不同,问将所有的车都修完,最少需要花费的时间. 注释:$2\le m\le 9$,$1\le n \ ...
- LG2053/BZOJ1070 「SCOI2007」修车 费用流
问题描述 LG2053 BZOJ1070 题解 将\(m\)个修理工拆为\(n \times m\)个,将修理工和车辆看做二分图,连出一个完全二分图. 边流量为\(1\),费用为时间,费用流即可. \ ...
- BZOJ1070: [SCOI2007]修车(最小费用最大流,思维)
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...
- BZOJ1070 [SCOI2007]修车
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- [BZOJ1070][SCOI2007]修车(最小费用最大流)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1070 分析: 把每个工人拆成N个点.记为A[i,j]表示第i个工人修倒数第j辆车. 每 ...
- BZOJ-1070 修车 最小费用最大流+拆点+略坑建图
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...
随机推荐
- Delphi中的四舍五入函数
一.Delphi中的四舍五入法 四舍五入是一种应用非常广泛的近似计算方法,针对不同的应用需求,其有算术舍入法和银行家舍入法两种. 所谓算术舍入法,就是我们通常意义上的四舍五入法.其规则 ...
- AWK 介绍
一.模式和动作 awk脚本是由模式和操作组成的:pattern {action} pattern与{action}两者是可选的.如果没有模式,则action应用到全部记录,如果没有action,则输出 ...
- 网络编程Socket UDP
图表流程 linux udp测试代码 //server.c #include <stdio.h> #include <stdlib.h> #include <errno. ...
- 【转】O'Reilly Java系列书籍建议阅读顺序(转自蔡学庸)
Learning Java the O'Reilly's Way (Part I) Java 技术可以说是越来越重要了,不但可以用在计算机上,甚至连电视等家电用品,行动电话.个人数字助理(PDA)等电 ...
- 2016 系统设计第一期 (档案一)MVC 相关控件整理
说明:前者是MVC,后者是boostrap 1.form 表单 @using (Html.BeginForm("Create", "User", FormMet ...
- EXTJS 4.2 资料 控件之Window窗体自动填充页面
1.html页面代码: <div id="component" style="width:100%;height:100%"> <body&g ...
- hibernate动态创建数据库表名几种方式
数据库中数据量很大, 但又不可以删除时同时又要优化程序检索数据时间. 答:方式有很多比如 创建数据库表分区,创建索引, 存储过程等; 我这里采用动态创建数据库表的方式. 完全可以在不创建表分区情况下实 ...
- iOS定位坐标转换工具-b
坐标系介绍 首先介绍一下目前的定位坐标系统1.地球坐标 :( 代号:GPS.WGS84 )--- 有W就是世界通用的也就是原始坐标体系,这是国际公认的世界标准坐标体系: 使用 WGS84 坐标系统的产 ...
- VC++创建、调用dll的方法步骤
文章来源:http://www.cnblogs.com/houkai/archive/2013/06/05/3119513.html 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有 ...
- spoj 237
好牛的题 哈哈 #include <cstdio> #include <algorithm> #define S(n) scanf("%d",&n ...