Minimum Cost(最小费用最大流)
Description
It's known that the cost to transport one unit goods for different kinds from different supply places to different shopkeepers may be different. Given each supply places' storage of K kinds of goods, N shopkeepers' order of K kinds of goods and the cost to transport goods for different kinds from different supply places to different shopkeepers, you should tell how to arrange the goods supply to minimize the total cost of transport.
Input
Then come K integer matrices (each with the size N * M), the integer (this integer is belong to (0, 100)) at the i-th row, j-th column in the k-th matrix represents the cost to transport one unit of k-th goods from the j-th supply place to the i-th shopkeeper.
The input is terminated with three "0"s. This test case should not be processed.
Output
Sample Input
1 3 3
1 1 1
0 1 1
1 2 2
1 0 1
1 2 3
1 1 1
2 1 1 1 1 1
3
2
20 0 0 0
Sample Output
4
-1 题意:有n个商店,m个提供商,k种商品
接下来 n*k的矩阵,表示每个商店需要每个商品的数目;
再接下来m*k矩阵,表示每个提供商拥有每个商品的个数。
然后,对于每个物品k,都有n*m的矩阵。
i行j列表示:
从j提供商向i商店运送一个k商品的代价是多少。
判断所有的仓库能否满足所有客户的需求,如果可以,求出最少的运输总费用。 思路:关键是建图,建立一个源点是s = 0 和 汇点 t = n+m+1;
源点到m个供应商,费用为0,容量是这个提供商能够提供这种物品的数量;
每个供应商到每个商店,费用为输入的费用(添加双向边),容量为无穷大;
每个商店到汇点,费用为0,容量为这个商店需要这种商品的数目。 还要考虑到供不应求的情况,当需求量大于供应量时,不能满足,输出-1.
对于第r种商品,若它的需求量大于最大流量,也不能满足,输出-1;
对每1个商品进行建图寻找增光路,最后累加输出最小费用就行了;
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std; const int maxn = ;
const int INF = 0x3f3f3f3f;
int n,m,k;
int nn[maxn][maxn],need[maxn];
int hh[maxn][maxn],have[maxn];
int cost[maxn][maxn],res[maxn][maxn];//cost[i][j]表示i到j的费用,res[i][j]表示i到j的当前容量
int s, t;
int mincost,maxflow;
int dis[maxn],pre[maxn];
void build_graph(int x)
{
memset(res,,sizeof(res));
for(int i = ; i <= m; i++)
res[s][i+n] = hh[i][x];//源点指向每个供应商,费用为0,容量为该供应商提供的第r种商品
for(int i = ; i <= n; i++)
res[i][t] = nn[i][x];//所有商店指向汇点,费用为0,容量为该供应商需要的第r种商品
for(int i = ; i <= m; i++)
{
for(int j = ; j <= n; j++)
res[i+n][j] = INF;//每个供应商指向每个商店,容量为无穷大。
}
}
void spfa()
{
queue<int>que;
while(!que.empty())
que.pop();
memset(pre,-,sizeof(pre));
int inque[maxn];
memset(inque,,sizeof(inque));
for(int i = s; i <= t; i++)
dis[i] = INF;
dis[s] = ;
inque[s] = ;
que.push(s); while(!que.empty())
{
int u = que.front();
que.pop();
inque[u] = ; for(int i = ; i <= n+m+; i++)
{
if(res[u][i] && dis[i] > dis[u] + cost[u][i])
{
dis[i] = dis[u] + cost[u][i];
pre[i] = u;
if(!inque[i])
{
inque[i] = ;
que.push(i);
}
}
}
}
} void MCMF()
{
maxflow = ;//增光第r种商品的总流量,初始化为0;
int minflow;//当前增光路上可增加的最小流量;
while()
{
spfa();
if(pre[t] == -)//找不到增光路,退出
break; minflow = INF;
for(int u = t; u != s; u = pre[u])
{
minflow = min(minflow,res[ pre[u] ][u]);//寻找该增光路上的最小流量
}
for(int u = t; u != s; u = pre[u])
{
res[ pre[u] ][u] -= minflow;
res[u][ pre[u] ] += minflow;
}
maxflow += minflow;
mincost += minflow*dis[t];
}
} int main()
{
while(~scanf("%d %d %d",&n,&m,&k))
{
if(n == && m == && k == )
break;
bool flag = ;
s = ;//源点
t = n+m+;//汇点
mincost = ;//最小费用初始化;
memset(need,,sizeof(need));
memset(have,,sizeof(have));
//nn[i][j]表示第i个商店需求nn[i][j]个第j种商品;
for(int i = ; i <= n; i++)
{
for(int j = ; j <= k; j++)
{
scanf("%d",&nn[i][j]);
need[j] += nn[i][j];
}
}
//hh[i][j]表示第i个供应商拥有hh[i][j]个第j中商品;
for(int i = ; i <= m; i++)
{
for(int j = ; j <= k; j++)
{
scanf("%d",&hh[i][j]);
have[j] += hh[i][j];
}
}
//如果第i种商品的需求量大于供应量,标记为1,但后面的仍然要继续输入
for(int i = ; i <= k; i++)
{
if(need[i] > have[i])
{
flag = ;
break;
}
}
//下面输入k个n*m的矩阵,其第i行第j列表示第j个供应商向第i个商店运送第k个商品的单位费用;
for(int r = ; r <= k; r++)
{
memset(cost,,sizeof(cost));
for(int i = ; i <= n; i++)
{
for(int j = ; j <= m; j++)
{
scanf("%d",&cost[j+n][i]);
cost[i][j+n] = -cost[j+n][i];//注意添加双向边
}
}
if(flag) continue;//如果已经不合法,就不用建图,但数据要继续输入 build_graph(r);
MCMF();
if(need[r] > maxflow) flag = ;//如果第r种商品的需求量大于最大流量,也不合法。
}
if(flag) printf("-1\n");
else printf("%d\n",mincost);
}
return ;
}
Minimum Cost(最小费用最大流)的更多相关文章
- POJ2516:Minimum Cost(最小费用最大流)
Minimum Cost Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19088 Accepted: 6740 题目链 ...
- POJ2516 Minimum Cost —— 最小费用最大流
题目链接:https://vjudge.net/problem/POJ-2516 Minimum Cost Time Limit: 4000MS Memory Limit: 65536K Tota ...
- POJ 2516 Minimum Cost [最小费用最大流]
题意略: 思路: 这题比较坑的地方是把每种货物单独建图分开算就ok了. #include<stdio.h> #include<queue> #define MAXN 500 # ...
- Poj 2516 Minimum Cost (最小花费最大流)
题目链接: Poj 2516 Minimum Cost 题目描述: 有n个商店,m个仓储,每个商店和仓库都有k种货物.嘛!现在n个商店要开始向m个仓库发出订单了,订单信息为当前商店对每种货物的需求 ...
- POJ 2516 Minimum Cost (最小费用最大流)
POJ 2516 Minimum Cost 链接:http://poj.org/problem?id=2516 题意:有M个仓库.N个商人.K种物品.先输入N,M.K.然后输入N行K个数,每一行代表一 ...
- POJ2516 Minimum Cost(最小费用最大流)
一开始我把每个店主都拆成k个点,然后建图..然后TLE.. 看题解= =哦,愚钝了,k个商品是独立的,可以分别跑k次最小费用最大流,结果就是k次总和.. #include<cstdio> ...
- POJ2516 Minimum Cost【最小费用最大流】
题意: 有N个客户,M个仓库,和K种货物.已知每个客户需要每种货物的数量,每个仓库存储每种货物的数量,每个仓库运输各种货物去各个客户的单位费用.判断所有的仓库能否满足所有客户的需求,如果可以,求出最少 ...
- POJ - 2516 Minimum Cost(最小费用最大流)
1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.K种物品拆开来,分别对每种物品 ...
- POJ--2516--Minimum Cost【最小费用最大流】
链接:http://poj.org/problem?id=2516 题意:有k种货物,n个客户对每种货物有一定需求量,有m个仓库.每一个仓库里有一定数量的k种货物.然后k个n*m的矩阵,告诉从各个仓库 ...
随机推荐
- Android画廊控件之Gallery
Gallery:用来显示图片列表.可以左右拖动. 如图: 图片取自http://www.cnblogs.com/menlsh/archive/2013/02/26/2934434.html 在Gall ...
- java新手笔记16 面积
1.图形类 package com.yfs.javase; public class Shape { //计算面积方法 public double getArea() { System.out.pri ...
- Qt 之 QtScript
前言 前面学习中,很多地方都用到了C++和JavaScript相互通信.今天就学习QtScript模块吧. Qt 包含完全集成的 ECMA 标准脚本引擎.Qt Script 集成了 QObject,为 ...
- C++类继承内存布局(二)
转自:http://blog.csdn.net/jiangyi711/article/details/4890889# (二 )成员变量 前面介绍完了类布局,接下来考虑不同的继承方式下,访问成员变量的 ...
- c++primer复习(一)
1 const对象默认为文件的局部变量(P50) a.cpp ; b.cpp extern int a;//undefined reference to "a" a.cpp ; b ...
- Ubuntu下VIM(GVIM)环境配置
GVIM安装( Ubuntu自带VIM ): 通过应用商店安装或者通过以下安装. sudo apt-get install vim-gnome GVIM配置: 在 家目录 ( ~/ ) 下建立 .vi ...
- JavaWeb用户登录功能的实现
大四快毕业了,3年多的时间中,乱七八糟得学了一大堆,想趁找工作之前把所学的东西整理一遍,所以就尝试着做一个完整的JavaWeb系统,这几天试着做了一个用户登录的功能,分享给大家,肯定有很多不完善的地方 ...
- datareader 和dataset 区别
ADO.NET2.0提供了两个用于检索关系数据的对象:DataSet和DataReader.并且这两个对象都可以将检索的关系数据存储在内存中.在软件开发过程中经常用到这两个控件,由于这两个控件在使用和 ...
- 数组-去重、排序方法、json排序
1.数组去重 /*方法一: 1,'1' 会被认为是相同的; 所有hash对象,如:{x;1},{y:1}会被认为是相同的 //10ms */ Array.prototype.unique=functi ...
- 【javascript 引用类型(一)】
javascript 的引用类型大致分为:Object 类型.Array 类型.Date 类型.RegExp 类型.Function 类型.基本包装类型和单体内置对象.这里我们着重介绍 Object ...