POJ3686_The Windy's_最小费用流::最小权匹配

题意

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) );
            }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值