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的矩阵,告诉从各个仓库 ...
随机推荐
- 自定义控件学习 Day44
自定义控件学习 Day44 onMeasure 测量控件的宽高. onLayout 设置位置 onDarw 绘制控件 问题堆栈 1. 事件监听传递 最外层获取到控件,根据事件事件传递机制,返回值fal ...
- 淘宝可以传照片搜索商品,verygood.雅客VC多味水果糖
奶奶喜欢吃点硬糖.在当地买了些说是不好.到是一个亲戚买的一种糖比较满意(好久了都快融化了). 但是我只有照片,能知道品牌,在jd没这样一样的商品了. 还好借助淘宝的传照片功能,找到了.
- visual studio vs2010 vs2013 显示详细调试信息方法;vs debug 出错怎么办,你需要的不是答案,是方法。
显示详细的输出信息: 选项--项目和解决方案--生成并运行--MSBuild项目生成输出详细信息: 这样在输出目录就会显示详细的错误信息,可以自己分析了.
- ios 64位下编译webrtc的libvpx库出现错误Bad cputype for object file.Currently only tested for CPU_TYPE_x86_64
diff --git a/libvpx.gyp b/libvpx.gypindex 4f8cb2b..4eb6866 100644--- a/libvpx.gyp+++ b/libvpx.gyp@@ ...
- java中移位运算符:<<、>>和>>>之间的比较
一.说明 <<:运算符将二进制位进行左移操作 >>:运算符将二进制位进行右移操作 >>>:运算符将用0填空高位 二.举例 /** * *----------c ...
- js生成随机字符串或者随机数
//返回一个指定范围内的随机数 function createRandomNum(Min,Max){ let Range = Max - Min; let Rand = Math.random(); ...
- SQL Server中count(*), count(col), count(1)的对比
让我们先看一下BOL里面对count(*)以及count(col)的说明: COUNT(*) 返回组中的项数.包括 NULL 值和重复项. COUNT(ALL expression) 对组中的每一行都 ...
- 解决修改SQL SERVER 默认1433端口 访问出错的问题;
1. 如何修改 数据库默认的 1433端口: SQL SERVER 配置管理器中 SQLSERVER 网络配置 xxx数据实例的协议中的 TCP/IP 中 默认端口 都修改为 自己定义的端口 例如 ...
- php 接口 implements 使用
主要对类名,类所拥有的方法,以及所传参数起约束和规范做用,感觉跟php abstract 抽象类又有点像. 一,接口的定义和调用 <?php interface face1 { const pa ...
- wamp的mysql密码修改
==方法1== 通过WAMP打开mysql控制台,提示输入密码,因为现在是空,所以直接按回车. 输入“use mysql”,意思是使用mysql这个数据库教程,提示“Database changed” ...