题意
N 个玩具交给 M 个工厂。j 号工厂加工 i 号玩具需要花费 Zij 时间。每个玩具都要在一个工厂里完成。玩具的顺序是任意的。每个工厂在完全加工好一个玩具之前,都不能处理别的订单。请问加工完所有玩具的平均时间的最小值。
思路
加工一件玩具花费的时间包括 等待加工的时间 + 加工它的时间。这一点题目里居然没有说明,总感觉会很困扰。
一眼看上去就是一个最小费用流的问题,而且很像拆点的题型。但是常规的按时间拆工厂点,在这里显然行不通。考虑到玩具的总数不多,可以按“第几次使用”来拆工厂点。但是这么拆点的话,费用要怎么算呢。
平均时间就是总时间除以玩具数,所以这里只需要最小化总时间就好了。
对于工厂 j 来说,如果它一共加工了 c 个玩具,那么第 1 个玩具的时间被重复计算了 c 次,第 2 个被重复计算了 c - 1 次······到这还是想不到该怎么做。。。那就反过来想,先安排排在后面的,再安排排在前面的。如果玩具 p 是工厂 j 加工的导数第 q 件,也就是它后面还有 q - 1 件,那么它的花费就是 Zpj * q。这样的话就能够确定玩具店与按次数拆分的工厂店之间的花费了!
感觉我说的还是很迷,还是把《挑战程序设计竞赛》上的说法贴到这吧。
题目链接
http://poj.org/problem?id=3686
AC代码
这里只贴建图部分的代码吧
int s = 0, t = n + m * n + 1;
for(int i= 1; i<= n; i++)
add(s, i, 1, 0);
for(int i= n+1; i< t; i++)
add(i, t, 1, 0);
for(int i= 1; i<= n; i++)
for(int j= 1; j<= m; j++)
{
int temp;
cin >> temp;
for(int k= 0; k< n; k++)
add(i, n + k * m + j, 1, temp * (k + 1) );
}