题意:

有N个客户,M个仓库,和K种货物。已知每个客户需要每种货物的数量,每个仓库存储每种货物的数量,每个仓库运输各种货物去各个客户的单位费用。判断所有的仓库能否满足所有客户的需求,如果可以,求出最少的运输总费用。

思路:

最小费用最大流。先判断是否每种货物的存储总量都足够,足够的话,对每一种货物进行一次最小费用最大流求出完成这种货物运输的最小总费用,所有的总费用相加就是结果了。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> using namespace std;
const int maxn = ;
const int inf = ; int n, ans;
int cap[maxn][maxn], pre[maxn];
int cost[maxn][maxn], dis[maxn];
int que[maxn];
bool vis[maxn]; bool spfa()
{
int i, head = , tail = ;
for(i = ; i <= n; i ++){
dis[i] = inf;
vis[i] = false;
}
dis[] = ;
que[] = ;
while(tail != head){
int u = que[head];
vis[u] = true;
for(i = ; i <= n; i ++)
if(cap[u][i] && dis[i] > dis[u] + cost[u][i]){
dis[i] = dis[u] + cost[u][i];
pre[i] = u;
if(!vis[i]){
vis[i] = true;
que[tail ++] = i;
if(tail == maxn) tail = ;
}
}
vis[u] = false;
head ++;
if(head == maxn) head = ;
}
if(dis[n] == inf) return false;
return true;
} void end()
{
int i, sum = inf;
for(i = n; i != ; i = pre[i])
sum = min(sum, cap[pre[i]][i]);
for(i = n; i != ; i = pre[i]){
cap[pre[i]][i] -= sum;
cap[i][pre[i]] += sum;
ans += cost[pre[i]][i] * sum;
}
} int main()
{
int N, M, K, i, j, k;
int need[maxn][maxn], NeedK[maxn];
int have[maxn][maxn], HaveK[maxn];
while(cin>>N>>M>>K,N,M,K)
{
memset(NeedK, , sizeof(NeedK));
for(i = ; i <= N; i ++)
for(j = ; j <= K; j ++){
scanf("%d", &need[i][j]); // 第i个客户需要第j种货物的量。
NeedK[j] += need[i][j]; // 第j种货物总共需要的量。
}
memset(HaveK, , sizeof(HaveK));
for(i = ; i <= M; i ++)
for(j = ; j <= K; j ++){
scanf("%d", &have[i][j]); // 第i个仓库存储第j种货物的量。
HaveK[j] += have[i][j]; // 第j种货物总共需要的量。
}
bool flag = true;
for(i = ; i <= K; i ++) // 判断所有货物是否足够。
if(NeedK[i] > HaveK[i]){
flag = false; break;
}
ans = ;
n = N + M + ;
for(k = ; k <= K; k ++){
memset(cap, , sizeof(cap));
for(i = ; i <= N; i ++) // 建图。
for(j = ; j <= M; j ++){
scanf("%d", &cost[j][M+i]);
cost[M+i][j] = -cost[j][M+i];
cap[j][M+i] = inf;
}
if(!flag) continue;
for(i = ; i <= M; i ++){
cap[][i] = have[i][k];
cost[][i] = cost[i][] = ;
}
for(i = ; i <= N; i ++){
cap[M+i][n] = need[i][k];
cost[M+i][n] = cost[n][M+i] = ;
}
while(spfa()) end(); // 最小费用最大流算法。
}
if(flag) cout << ans << endl;
else cout << - << endl;
}
return ;
}

POJ2516 Minimum Cost【最小费用最大流】的更多相关文章

  1. POJ2516 Minimum Cost —— 最小费用最大流

    题目链接:https://vjudge.net/problem/POJ-2516 Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Tota ...

  2. POJ2516:Minimum Cost(最小费用最大流)

    Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 19088   Accepted: 6740 题目链 ...

  3. Minimum Cost(最小费用最大流)

    Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his s ...

  4. POJ 2516 Minimum Cost [最小费用最大流]

    题意略: 思路: 这题比较坑的地方是把每种货物单独建图分开算就ok了. #include<stdio.h> #include<queue> #define MAXN 500 # ...

  5. Poj 2516 Minimum Cost (最小花费最大流)

    题目链接: Poj  2516  Minimum Cost 题目描述: 有n个商店,m个仓储,每个商店和仓库都有k种货物.嘛!现在n个商店要开始向m个仓库发出订单了,订单信息为当前商店对每种货物的需求 ...

  6. POJ2516 Minimum Cost(最小费用最大流)

    一开始我把每个店主都拆成k个点,然后建图..然后TLE.. 看题解= =哦,愚钝了,k个商品是独立的,可以分别跑k次最小费用最大流,结果就是k次总和.. #include<cstdio> ...

  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次费用流)

    Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 19883   Accepted: 7055 Des ...

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

    1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.K种物品拆开来,分别对每种物品 ...

随机推荐

  1. Spring的各个jar包的作用介绍

    spring4中各个jar包的介绍: Spring AOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects:Spring提供的对AspectJ框架的整合Sp ...

  2. Luogu3804 【模板】后缀自动机(后缀自动机)

    建出parent树统计即可.开始memcpy处写的是sizeof(son[y]),然后就T掉了……还是少用这种东西吧. 同时也有SA做法.答案子串一定是名次数组中相邻两个串的lcp.单调栈统计其是几个 ...

  3. java 使用 WebUploader

    参考: http://blog.csdn.net/finalAmativeness/article/details/54668090 最近项目需要多文件上传. 所以使用了 baidu的 webuplo ...

  4. MT【238】内心轨迹

    已知$F_1,F_2$为椭圆$C:\dfrac{x^2}{4}+\dfrac{y^2}{3}=1$的左右焦点,点$P$在椭圆$C$上移动时,$\Delta{F_1PF_2}$的内心$I$的轨迹方程为_ ...

  5. 03 Zabbix4.0添加cisco交换机基本监控步骤

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 03 Zabbix4.0添加cisco交换机基本监控步骤 主题监控一台cisco网络设备的6项内容 ...

  6. 沉迷Link-Cut tree无法自拔之:[BZOJ3514] Codechef MARCH14 GERALD07 加强版

    来自蒟蒻 \(Hero \_of \_Someone\) 的 \(LCT\) 学习笔记 $ $ 又是一道骚题...... 先讲一个结论: 假设我们用 \(LCT\) 来做这道题, 在插入边 \(i\) ...

  7. NOIp2017D2T2(luogu3959) 宝藏 (状压dp)

    时隔多年终于把这道题锅过了 数据范围显然用搜索剪枝状压dp. 可以记还有哪些点没到(或者已到了哪些点).我们最深已到的是哪些点.这些点的深度是多少,然后一层一层地往下推. 但其实是没必要记最深的那一层 ...

  8. ThinkPHP5 隐藏index.php问题

    隐藏index.php 可以去掉URL地址里面的入口文件index.php,但是需要额外配置WEB服务器的重写规则. 以Apache为例,需要在入口文件的同级添加.htaccess文件(官方默认自带了 ...

  9. 手动实现staticmethod和classmethod装饰器

    首先,staticmethod和classmethod装饰器是通过非数据描述符实现的.用法简单,这里就不细说了. 这里主要分析一下staticmethod和classmethod是如何通过描述符实现的 ...

  10. python2和python3的主要区别

    作为一个py3土著,并不是很关心这个问题,但是总有人隔三差五问这个问题,还是捋了一下. 这里列出几个主要区别: 1.最常见的人尽皆知的print()函数 在py2中,print是一个语句,不带括号,也 ...