/*
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
poj3686(*最小费用流-转化成普通指派问题)
最新推荐文章于 2021-10-29 22:08:24 发布
该博客讨论如何使用最小费用最大流算法解决一个订单分配问题,将其转化为指派问题。当每个工厂可以处理多个订单时,通过拆分工厂节点以确保每个节点仅能处理一个订单,然后应用最小费用流算法找到使所有订单平均完成时间最短的解决方案。
摘要由CSDN通过智能技术生成