题意:

有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. 激活win10专业版

    每180天激活一次

  2. 微信小程序入門學習資料鏈接

    https://blog.csdn.net/github_38847071/article/details/73250258 https://blog.csdn.net/lily2016n/artic ...

  3. BZOJ2141排队——树状数组套权值线段树(带修改的主席树)

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...

  4. BZOJ2795&2890&3647[Poi2012]A Horrible Poem——hash

    题目描述 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. 输入 第一行一个正整数n (n<= ...

  5. poj2115-C Looooops -线性同余方程

    线性同余方程的模板题.和青蛙的约会一样. #include <cstdio> #include <cstring> #define LL long long using nam ...

  6. MT【209】打破对称

    设正数$a,b,c$满足$ab+bc+ca=47$,求$(a^2+5)(b^2+5)(c^2+5)$的最小值_____ 解:$(a^2+5)(b^2+5)(c^2+5)=(a^2+5)(5(b+c)^ ...

  7. Powershell script to install Windows Updates (msu) from folder

    ######################################################### # # Name: InstallWindowsUpdates.ps1 # Auth ...

  8. Android 自定义ImageView支持缩放,拖拽,方便复用

    今天刚发了一篇关于ImageView的缩放和拖拽的博客,然后我想了下,将他自定义下,方便我们来复用这个imageView,效果我就不多说了,http://blog.csdn.net/xiaanming ...

  9. onTouchEvent方法的使用

    手机屏幕事件的处理方法onTouchEvent.该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件.该方法的签名如下所示. public  ...

  10. 使用 <!DOCTYPE html> 让 <div><img></div>中的图片下面产生几个像素的空白间隔

    今天算是第一次使用 <!DOCTYPE html> 不经意间发现图片下方有5个像素左右的空白间隔,检查半天也没查出原因. 最后百度了一下,网上说这是 <!DOCTYPE html&g ...