题目大概意思为有N个玩具,M个工厂,每个工厂一次只能生产一个玩具,顺序任意,求所有玩具的加工完的平均时间最小值
例:N = 3 M = 2 Z = {{1,100},{100,1},{1,100}}
就相当于第一个在一工厂加工完花了 1 时间,第二个在二工厂加工完花了 1 时间,第三个在一工厂要等第一个做完再做,花了 2 时间,所以总共花了 4 时间,平均花了1.333333

假设一个工厂里有num个玩具来加工,则在该工厂所花的时间为 T = num * t_1 + (num - 1) * t_2 +…+1 * t_num(t_第几个制作)
我们把一个工厂拆开来看,把 M 个拆成 M * N 个(因为 num <= N ), i * N + j 个工厂,相当于第 i 个工厂中第 num - j + 1 个制作玩具,即该工厂倒数第 j 个制作玩具

然后我们设置一个超级源点,连接 N 个玩具,边的容量为1,费用为0,这样便限制了一个玩具只能制造一次
再设置一个超级汇点,连接 N * M 个工厂,边的容量为1,费用为0,这样限制了一个工厂不会同时生产两个玩具
再把 N 个玩具和 N * M 个工厂分别相连( i * N + j ), 边的容量为0,费用为 制造时间 * j,这样当最大流为N时,M个工厂都能正确的得到生产时间,也就能正确得到生产总时间
(需要注意,由于我们求的时最小费用流,所以当 j 存在较小的没有使用时,是不会使用较大的,因为这样的 制造时间 * j 更小,所以这样可以导致我们的一个工厂拆开的 j 个工厂,相当于 j 从小到大被连接,这样相当于把 T = num * t_1 + (num - 1) * t_2 +…+1 * t_num 倒过来考虑了,是符合题意的)

套最小费用流模板,把最后得到的值除以 N 即可。

#include <iostream>
#include <stdio.h>
#include <vector>
#define INF 1000000005
using namespace std;
int n, m;
int data[55][55];
struct edge
{int to, cap, coust, rev;edge(int t, int c, int s, int r){to = t; cap = c; coust = s; rev = r;}
};
vector<struct edge> ddd[3005];
int dist[3005];
int prev[3005];
int prep[3005];
void add_edge(int from, int to, int cap, int coust)
{ddd[from].push_back(edge(to, cap, coust, ddd[to].size()));ddd[to].push_back(edge(from, 0, -coust, ddd[from].size() - 1));
}
int min_coust(int from, int to, int flow)
{int res = 0;while(flow > 0){fill(dist, dist + n + n * m + 2, INF);dist[from] = 0;bool flag = true;while(flag){flag = false;for(int i = 0; i < n + n * m + 2; i++){if(dist[i] != INF){for(int j = 0; j < ddd[i].size(); j++){struct edge e = ddd[i][j];if(e.cap != 0 && dist[i] + e.coust < dist[e.to]){flag = true;dist[e.to] = dist[i] + e.coust;prev[e.to] = i;prep[e.to] = j;}}}}}int d = flow;for(int i = to; i != from; i = prev[i]){d = min(d, ddd[prev[i]][prep[i]].cap);}for(int i = to; i != from; i = prev[i]){ddd[prev[i]][prep[i]].cap -= d;ddd[i][ddd[prev[i]][prep[i]].rev].cap += d;}res = res + dist[to] * d;flow = flow - d;}return res;
}
int main()
{int N;scanf("%d", &N);while(N--){for(int i = 0; i < n + n * m + 2; i++){ddd[i].clear();}scanf("%d %d", &n, &m);for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){scanf("%d", &data[i][j]);}}for(int i = 1; i <= n; i++){add_edge(0, i, 1, 0);for(int j = 1; j <= m; j++){for(int k = 1; k <= n; k++){add_edge(i, n + (j - 1) * n + k, 1, k * data[i][j]);}}}for(int i = 1; i <= m; i++){for(int j = 1; j <= n; j++){add_edge(n + (i - 1) * n + j, n + m * n + 1, 1, 0);}}printf("%.6f\n", min_coust(0, n + m * n + 1, n) / (double)n);}
}

poj3686(最小费用流)相关推荐

  1. poj3680(最小费用流 + 拆点)

    (又是一道简单的最小费用流的题目) 题目大概意思为有N个带权的开区间,现在从中选取一些区间,使任意点都不能被超过k个区间覆盖,求最大权重和 首先我们求得是最大的权重和,所以我们把 权重 ,看为 -权重 ...

  2. poj3422(最小费用流 + 拆点)

    题目大概意思为有一个N × N矩阵,每个格子里都有一个非负数,一辆车从左上方的网格移动到右下方的网格k次(车只向右或向下移动).每次访问格子后,其替换为0,且将其加入到金额中.求第k次旅行后能得到的最 ...

  3. poj2195(最小费用流)

    (最小费用流的入门基础题) 题目大概意思为在一个矩阵中,有n个小人和n个房子,小人每走一格花费1美元,小人只能上下左右走,且可以经过房子但不进去,为了让每个小人有自己的房子,求最小费用 首先统计每个小 ...

  4. poj3068(最小费用流)

    (和poj2135很像很像,就多了一个情况而已,基础入门题) 题目大概意思为总共有N个仓库,求两条不同路径从起点到达终点,若是没有两条,打出Not possible,若是有可能打出所需最小费用 很简单 ...

  5. HDU 5988 最小费用流

    链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5988 题意: n个点,每个点有a个人和b包饭,m条边,第一次经过这条边没有问题,以后每一个经 ...

  6. POJ3686 The Windy's 【费用流】*

    POJ3686 The Windy's Description The Windy's is a world famous toy factory that owns M top-class work ...

  7. 【转载】网络流和最小费用流

    这段时间复习了下网络流模型,感觉比以前的理解有了长足进展,虽然我知道这东西难就难在建模上,而它的算法本身其实难度不大,但我还是决定说一些我的理解,毕竟理解了本质的东西运用起来才会更灵活. 最大流的求解 ...

  8. 一般图带权多重匹配(欧拉图+最小费用流)

    problem 给定 nnn 个数 {ai}\{a_i\}{ai​},其中 kkk 个 aia_iai​ 是奇数,再给一个 n×nn\times nn×n 的矩阵 {ci,j}\{c_{i,j}\}{ ...

  9. hdu3526(最小费用流)

    Description Xiao A isbecoming more and more unsatisfied with his computer since he is learninghacker ...

最新文章

  1. MySQL优化之查询缓存(mysql8官方已经废弃这个功能)
  2. Spring注解开发-@Scope作用域注解
  3. 【机器视觉】 for算子
  4. RTMPdump(libRTMP) 源代码分析 6: 建立一个流媒体连接 (NetStream部分 1)
  5. SAP Commerce开发时的Spring学习要点记录
  6. 平板电脑应用_什么是机房巡检AI机器人?工业平板电脑的应用如何体现
  7. functions.php 在哪,functions.php常用函数
  8. ESXI 6.7安装并部署主机
  9. zero copy图解
  10. 计算机帮教助教活动总结,【助教总结】_助教总结范文三篇
  11. Android源码分析(一)-----如何快速掌握Android编译文件
  12. 从HDFS看分布式文件系统的设计需求
  13. ADS软件的使用教程
  14. 计算机中所占百分数用哪个函数,Excel中Percentrank函数的使用-计算所占百分比
  15. 实时网速怎么看快慢_iQOO怎么显示网速 网络状态实时查看
  16. Microsemi Libero使用技巧1——查看芯片资源占用情况
  17. Win10应用程序添加到右键中
  18. oracle软件工程,.Net软件工程师学用Oracle系列(9):系统函数(上)
  19. 滴滴校招编程题-田径运动会比赛排名
  20. VUE项目引入微信JSSDK 实现微信自定义分享

热门文章

  1. 一年融4轮,虎赞科技完成红杉领投3000万美元B轮融资
  2. windows 常用thread方法
  3. OC中的NSNumber、NSArray、NSString的常用方法
  4. 返回顶部的js实现(jQuery/MooTools)
  5. [收集] Web服务相关的, 介绍框架(framework)类的论文
  6. 前端电脑和浏览器分辨率不同_不同岗位的程序员如何选电脑 :)
  7. arm b bl 地址无关码_ARM_异常和中断
  8. 对于初学者Python开发难学吗?适合初学者吗?
  9. 利用Python基础代码语句,实现2G时代文字小游戏,世界如此简单
  10. 50k大牛告诉你Python怎么学,10个特性带你快速了解python