poj3686(*最小费用流-转化成普通指派问题)

/*
translation:
    有n个订单要交给m个工厂完成。给出每个订单在每个工厂的完成时间。求一个最佳方案使得完成所有订单的平均时间最短。
solution:
    最小费用最大流
    如果每个工厂只能完成一个订单的话,那就是指派问题了。跑一遍最小费用流即可。但是题目每个工厂可能完成多个。
    所以需要将其拆点使得每个工厂只能完成一个订单,进而转换成指派问题。对一个工厂来说,如果每个订单都在这个
    工厂完成的话,那么时间为T=t1 + (t1+t2) + (t1+t2+t3) +... = n*t1 + (n-1)*t2 + (n-2)*t3 + ...就可将其看成
    是n个只能完成一个订单的工厂。
note:
    * 其实这道题与poj3057有异曲同工之处。3057是将每道门拆成不同时刻且每次只能进一个人对应的门。而这道题是将
      每个工厂拆分成每次只能处理一个订单的工厂。都是将原问题转化成普通指派问题。
      
*/
#include <iostream>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>

using namespace std;
const int maxn = 3000;
const int INF = 0x3f3f3f3f;

typedef pair<int,int> P;
struct Edge
{
    int to, cap, cost, rev;
    Edge(int to_, int cap_, int cost_, int rev_):to(to_),cap(cap_),cost(cost_),rev(rev_){}
};

vector<Edge> G[maxn];
int V, n, m, relation[55][55];
int h[maxn], dist[max
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值