题意

      有n个顾客,m个供应商,k种货物,给你顾客对于每种货物的要求个数,和供应商对于每种货物的现有量,以及供应每种货物的时候供应商和顾客之间的运输单价,问你满足所有顾客的前提下的最小运输费用是多少。

思路:

      满足所有顾客的前提下的最小花费,很容易就想到了费用流,但是做这个题目有个小窍门,如果不想的话很可能把每个点拆成三个点,然后在去跑,但是这样感觉写着麻烦,AC肯定没问题,但是仔细想想,每种货物之间是没有任何关系的,那么我们何不直接每种货物都跑一遍费用流,这样写起来很简单,思路也清晰,建图的话应该不用说了吧,水建图。


  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4. #define N 50 + 5
  5. #define N_node 120
  6. #define N_edge 6000
  7. #define INF 100000000
  8. using namespace std;
  9. typedef struct
  10. {
  11. int from ,to ,next ,cost ,flow;
  12. }STAR;
  13. STAR E[N_edge];
  14. int list[N_node] ,tot;
  15. int s_x[N_node] ,mer[N_edge];
  16. int need[N][N] ,supply[N][N];
  17. void add(int a ,int b ,int c ,int d)
  18. {
  19. E[++tot].from = a;
  20. E[tot].to = b;
  21. E[tot].cost = c;
  22. E[tot].flow = d;
  23. E[tot].next = list[a];
  24. list[a] = tot;
  25. E[++tot].from = b;
  26. E[tot].to = a;
  27. E[tot].cost = -c;
  28. E[tot].flow = 0;
  29. E[tot].next = list[b];
  30. list[b] = tot;
  31. }
  32. bool spfa(int s ,int t ,int n)
  33. {
  34. for(int i = 0 ;i <= n ;i ++)
  35. s_x[i] = INF;
  36. int mark[N_node] = {0};
  37. s_x[s] = 0 ,mark[s] = 1;
  38. queue<int>q;
  39. q.push(s);
  40. memset(mer ,255 ,sizeof(mer));
  41. while(!q.empty())
  42. {
  43. int xin ,tou = q.front();
  44. q.pop();
  45. mark[tou] = 0;
  46. for(int k = list[tou] ;k ;k = E[k].next)
  47. {
  48. xin = E[k].to;
  49. if(s_x[xin] > s_x[tou] + E[k].cost && E[k].flow)
  50. {
  51. s_x[xin] = s_x[tou] + E[k].cost;
  52. mer[xin] = k;
  53. if(!mark[xin])
  54. {
  55. mark[xin] = 1;
  56. q.push(xin);
  57. }
  58. }
  59. }
  60. }
  61. return mer[t] != -1;
  62. }
  63. int M_C_Flow(int s ,int t ,int n ,int sum)
  64. {
  65. int maxflow = 0 ,mincost = 0 ,minflow;
  66. while(spfa(s ,t ,n))
  67. {
  68. minflow = INF;
  69. for(int i = mer[t] ;i + 1 ;i = mer[E[i].from])
  70. if(minflow > E[i].flow) minflow = E[i].flow;
  71. for(int i = mer[t] ;i + 1 ;i = mer[E[i].from])
  72. {
  73. E[i].flow -= minflow;
  74. E[i^1].flow += minflow;
  75. mincost += minflow * E[i].cost;
  76. }
  77. maxflow += minflow;
  78. }
  79. if(maxflow != sum) return -1;
  80. return mincost;
  81. }
  82. int main ()
  83. {
  84. int n ,m ,k ,i ,j ,price;
  85. while(~scanf("%d %d %d" ,&n ,&m ,&k) && n + m + k)
  86. {
  87. for(i = 1 ;i <= n ;i ++)
  88. for(j = 1 ;j <= k ;j ++)
  89. scanf("%d" ,&need[i][j]);
  90. for(i = 1 ;i <= m ;i ++)
  91. for(j = 1 ;j <= k ;j ++)
  92. scanf("%d" ,&supply[i][j]);
  93. int ans = 0 ,mk = 0;
  94. for(int ii = 1 ;ii <= k ;ii ++)
  95. {
  96. memset(list ,0 ,sizeof(list)) ,tot = 1;
  97. for(i = 1 ;i <= n ;i ++)
  98. for(j = 1 ;j <= m ;j ++)
  99. {
  100. scanf("%d" ,&price);
  101. if(!price) continue;
  102. add(i ,j + n ,price ,INF);
  103. }
  104. if(mk) continue;
  105. int sum = 0;
  106. for(i = 1 ;i <= n ;i ++)
  107. {
  108. add(0 ,i ,0 ,need[i][ii]);
  109. sum += need[i][ii];
  110. }
  111. for(i = 1 ;i <= m ;i ++)
  112. add(i + n ,n + m + 1 ,0 ,supply[i][ii]);
  113. int tmp = M_C_Flow(0 ,n + m + 1 ,n + m + 1 ,sum);
  114. if(tmp == -1) mk = 1;
  115. else ans += tmp;
  116. }
  117. mk ? puts("-1") : printf("%d\n" ,ans);
  118. }
  119. return 0;
  120. }

POJ 2516 基础费用流的更多相关文章

  1. poj 2135 (基础费用流)

    题意:从1到n再到1,每条边只能走一次,求最短距离. 建图:每条边只能走一次就是流量是1,添加源点与1相连,容量为2,费用为0,n与汇点相连容量为2,费用为0: 求增广路用SPFA最短路求,, #in ...

  2. POJ 2135 简单费用流

    题意:       题意是一个人他要从牧场1走到牧场n然后在走回来,每条路径只走一次,问全程的最短路径是多少. 思路:        这个题目挺简单的吧,首先要保证每条边只能走一次,然后还要要求费用最 ...

  3. POJ 2516 最小费用最大流

    每一种货物都是独立的,分成k次最小费用最大流即可! 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E[pe[v]^ ...

  4. poj 3680 Intervals(费用流)

    http://poj.org/problem?id=3680 巧妙的构图. 题目:给定N个区间(ai,bi)权值wi,求最大权和且每个点最多覆盖K次. 构图:将区间端点离散化,将第i个点连第i+1个点 ...

  5. POJ 2175 spfa费用流消圈

    题意:给出n栋房子位置和每栋房子里面的人数,m个避难所位置和每个避难所可容纳人数.然后给出一个方案,判断该方案是否最优,如果不是求出一个更优的方案. 思路:很容易想到用最小费用流求出最优时间,在与原方 ...

  6. POJ 1273 (基础最大流) Drainage Ditches

    虽然算法还没有理解透,但以及迫不及待地想要A道题了. 非常裸的最大流,试试lrj的模板练练手. #include <cstdio> #include <cstring> #in ...

  7. POJ 2516 Minimum Cost (最小费用最大流)

    POJ 2516 Minimum Cost 链接:http://poj.org/problem?id=2516 题意:有M个仓库.N个商人.K种物品.先输入N,M.K.然后输入N行K个数,每一行代表一 ...

  8. POJ - 2516 Minimum Cost 每次要跑K次费用流

    传送门:poj.org/problem?id=2516 题意: 有m个仓库,n个买家,k个商品,每个仓库运送不同商品到不同买家的路费是不同的.问为了满足不同买家的订单的最小的花费. 思路: 设立一个源 ...

  9. poj 2516 (费用流)

    题意:有N个供应商,M个店主,K种物品.每个供应商对每种物品的的供应量已知,每个店主对每种物品的需求量的已知,从不同的供应商运送不同的货物到不同的店主手上需要不同的花费,又已知从供应商m送第k种货物的 ...

随机推荐

  1. Vue入门干货,以及遇到的坑

    一.安装环境及Vue脚手架搭建 参考文档:https://www.jianshu.com/p/1626b8643676 二.开发文档 官方文档:https://cn.vuejs.org/v2/guid ...

  2. 【免费开源】基于Vue和Quasar的crudapi前端SPA项目实战—环境搭建 (一)

    背景介绍和环境搭建 背景 crudapi增删改查接口系统的后台Java API服务已经全部可用,需要一套后台管理UI,主要用户为开发人员或者对计算机有一定了解的工作人员,通过UI配置元数据和处理业务数 ...

  3. 2020年12月-第01阶段-前端基础-HTML常用标签

    1. HTML常用标签 首先 HTML和CSS是两种完全不同的语言,我们学的是结构,就只写HTML标签,认识标签就可以了. 不会再给结构标签指定样式了. HTML标签有很多,这里我们学习最为常用的,后 ...

  4. centos安装rar

    wget https://www.rarlab.com/rar/rarlinux-x64-5.5.0.tar.gz tar -xzvf rarlinux-x64-5.5.0.tar.gz cd rar ...

  5. python基础学习之函数进阶【匿名函数、作用域关系、闭包、递归】

    匿名函数 lambda的用法: lambda x:x+1 解释,同等于以下函数 def test(x): return x+1 因为没有函数名,所以称为匿名函数 只适用于简易的逻辑,复杂逻辑无法实现 ...

  6. Vue3手册译稿 - 深入组件 - 自定义事件

    本章节需要掌握组件基础 emit我译成发射,觉得发射这个词比较形象的形容将子组件事件发射出来的一个动作. 事件名 像组件和props,事件名也会进行自动转换,如果你在子组件里发射一个驼峰命名的事件,你 ...

  7. 王兴:为什么中国的 ToB 企业都活得这么惨?

    本文节选自美团创始人王兴的内部讲话.在讲话中,王兴罕见地分享了他对全球和中国宏观经济的理解,谈了他对 TO B 业务的深度思考. 我们今天讲一下餐饮生态业务部,以及对我们整个公司在整个业务发展过程中的 ...

  8. mongodb安装及常见命令操作

    Mongodb是一个介于关系数据库和非关系数据库之间的产品(Nosql),是非关系数据库当中功能最丰富,最像关系数据库的,语法有点类似javascript面向对象的查询语言,它是一个面向集合的,模式自 ...

  9. [源码解析] 并行分布式框架 Celery 之 worker 启动 (1)

    [源码解析] 并行分布式框架 Celery 之 worker 启动 (1) 目录 [源码解析] 并行分布式框架 Celery 之 worker 启动 (1) 0x00 摘要 0x01 Celery的架 ...

  10. 力扣 - 剑指 Offer 09. 用两个栈实现队列

    目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 09. 用两个栈实现队列 思路 刚开始想的是用stack1作为数据存储的地方,stack2用来作为辅助栈,如果添加元素直接push入stac ...