平均时间最短即总时间最短

首先不难想到,将每个工作人员拆成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的更多相关文章

  1. bzoj1070 修车&& bzoj2879美食节 【费用流】

    bzoj1070: 把每个工人拆成汽车那么多个点,假如说 工人(i, j) 和 汽车k 连边,那就代表第i个工人倒数第j个修汽车k,那么这条边对以后的贡献就是k*time[i修k]. #include ...

  2. 【BZOJ1070】[SCOI2007]修车

    [BZOJ1070][SCOI2007]修车 题面 以后要多写题面flag 题目描述 同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心.维修中心共有\(M\)位技术人员,不同的技术人员对不同 ...

  3. 【BZOJ1070】[SCOI2007]修车 费用流

    [BZOJ1070][SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的. ...

  4. 【BZOJ1070】修车(费用流)

    题意:同一时刻有N位车主带着他们的爱车来到了汽车维修中心. 维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的. 现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...

  5. [bzoj1070][SCOI2007]修车_费用流

    修车 bzoj-1070 SCOI-2007 题目大意:有m个人要修n台车,每个工人修不同的车的时间不同,问将所有的车都修完,最少需要花费的时间. 注释:$2\le m\le 9$,$1\le n \ ...

  6. LG2053/BZOJ1070 「SCOI2007」修车 费用流

    问题描述 LG2053 BZOJ1070 题解 将\(m\)个修理工拆为\(n \times m\)个,将修理工和车辆看做二分图,连出一个完全二分图. 边流量为\(1\),费用为时间,费用流即可. \ ...

  7. BZOJ1070: [SCOI2007]修车(最小费用最大流,思维)

    Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同 的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序, ...

  8. BZOJ1070 [SCOI2007]修车

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  9. [BZOJ1070][SCOI2007]修车(最小费用最大流)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1070 分析: 把每个工人拆成N个点.记为A[i,j]表示第i个工人修倒数第j辆车. 每 ...

  10. BZOJ-1070 修车 最小费用最大流+拆点+略坑建图

    1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...

随机推荐

  1. php三维数组去重(示例代码)

    php三维数组去重的示例代码.  假设叫数组 $my_array; <?php // 新建一个空的数组. $tmp_array = array(); $new_array = array(); ...

  2. 一个例子说明如何在DataSnap中使用FireDAC

    一.FireDAC调用DataSnap远程方法查询数据示例 1.服务端使用FDQUERY查询数据并返回TDATASET: function TServerMethods1.GetData(var sq ...

  3. 如何在eclipse中配置Selenium

    1, Install python 33.(Python 27也可以) 2, Setup Selenium If you did not install Easy_install module, yo ...

  4. Beaglebone Back学习五(PWM测试)

    PWM测试 参考链接 1 Enable PWM on BeagleBone with Device Tree overlays 2Using PWM on the Beaglebone Black 3 ...

  5. 记录类型中String的释放

    String能自动释放,在进行内存拷贝时需要进行手动释放.可以直接调用Finalize手工释放 如:TGraphicHideTab 记录中声明的Caption:string TGraphicHideT ...

  6. IOS 学习参考

    IOS 开发 http://code4app.com/ios/%E5%AE%9E%E6%97%B6%E6%9B%B4%E6%96%B0%E7%9A%84%E6%9B%B2%E7%BA%BF%E5%9B ...

  7. mysql mysqldump只导出表结构或只导出数据的实现方法

    mysql mysqldump只导出表结构或只导出数据的实现方法,需要的朋友可以参考下. mysql mysqldump 只导出表结构 不导出数据 复制代码代码如下: mysqldump --opt ...

  8. js学习之函数声明与函数表达式区别[原创]

    作为一名js初学者,与大家分享下.Javascript中有函数声明提升的功能,会优先编译函数声明部分.比如, ff(); function ff(){ alert("hello world. ...

  9. Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命周期

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  10. 3140:[HNOI2013]消毒 - BZOJ

    题目描述 Description 最近在生物实验室工作的小 T 遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为 a*b*c,a.b.c均为正整数.为了实验的方便,它被划 ...