POJ 2516 Minimum Cost(拆点+KM完备匹配)
题目链接:http://poj.org/problem?id=2516
题目大意:
第一行是N,M,K
接下来N行:第i行有K个数字表示第i个卖场对K种商品的需求情况
接下来M行:第j行有K个数字表示第j个库房对K种商品的存货情况
接下来K个N*M的矩阵:
每个矩阵(i,j)表示第k种商品从第j个库房运到第i个卖场的运费(单价)
求满足所有需求的最小花费,如果不能全部满足输出-1。
解题思路:
拆点,对于第k种商品有:
把每个卖场的需求按件数拆成各个小点(比如需要x件就看做x个点)
把每个库房的存货量按件数拆成各个小点(同上)
然后以运费为权值连边(单向边)
做K次完备匹配即可。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=;
const int M=;
const int INF=0x3f3f3f3f; int nx,ny,d;
int offer[N][N],need[N][N],cost[N][N][N];//cost[k][i][j]表示将第k件物品从供应商j送到老板i的花费
int lx[M],ly[M],link[M],g[M][M],belongA[M],belongB[M];
bool visx[M],visy[M]; bool dfs(int x){
visx[x]=true;
for(int y=;y<ny;y++){
if(visy[y]||!g[x][y]) continue;
int tmp=lx[x]+ly[y]-g[x][y];
if(tmp==){
visy[y]=true;
if(link[y]==-||dfs(link[y])){
link[y]=x;
return true;
}
}
else d=min(d,tmp);
}
return false;
} int KM(){
memset(link,-,sizeof(link));
memset(ly,,sizeof(ly));
for(int i=;i<nx;i++){
lx[i]=-INF;
for(int j=;j<ny;j++){
if(g[i][j]>lx[i])
lx[i]=g[i][j];
}
}
for(int x=;x<nx;x++){
while(true){
memset(visx,false,sizeof(visx));
memset(visy,false,sizeof(visy));
d=INF;
if(dfs(x)) break;
for(int i=;i<nx;i++){
if(visx[i])
lx[i]-=d;
}
for(int i=;i<ny;i++){
if(visy[i])
ly[i]+=d;
}
}
}
int ans=;
for(int i=;i<ny;i++){
if(link[i]!=-){
ans+=g[link[i]][i];
}
}
return ans;
} int main(){
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k)){
if(n==&&m==&&k==) break;
for(int i=;i<n;i++){
for(int j=;j<k;j++){
scanf("%d",&need[i][j]);
}
}
for(int i=;i<m;i++){
for(int j=;j<k;j++){
scanf("%d",&offer[i][j]);
}
}
for(int t=;t<k;t++){
for(int i=;i<n;i++){
for(int j=;j<m;j++)
scanf("%d",&cost[t][i][j]);
}
}
bool flag=true;
//首先对于一种商品,如果这种所有的存货不足需求就直接输出-1
for(int t=;t<k;t++){
int sum1=,sum2=;
for(int i=;i<n;i++){
sum1+=need[i][t];
}
for(int i=;i<m;i++){
sum2+=offer[i][t];
}
if(sum1>sum2){
flag=false;
break;
}
}
if(!flag){
puts("-1");
continue;
}
int ans=;
for(int t=;t<k;t++){
int cntA=,cntB=;
//拆点,
for(int i=;i<n;i++){
for(int j=;j<need[i][t];j++){
belongA[cntA++]=i;
}
}
for(int i=;i<m;i++){
for(int j=;j<offer[i][t];j++){
belongB[cntB++]=i;
}
}
for(int i=;i<cntA;i++){
for(int j=;j<cntB;j++){
g[i][j]=-cost[t][belongA[i]][belongB[j]];
}
}
nx=cntA,ny=cntB;
ans+=KM();
}
printf("%d\n",-ans);
}
return ;
}
POJ 2516 Minimum Cost(拆点+KM完备匹配)的更多相关文章
- POJ 2516 Minimum Cost (网络流,最小费用流)
POJ 2516 Minimum Cost (网络流,最小费用流) Description Dearboy, a goods victualer, now comes to a big problem ...
- 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个数,每一行代表一 ...
- POJ - 2516 Minimum Cost 每次要跑K次费用流
传送门:poj.org/problem?id=2516 题意: 有m个仓库,n个买家,k个商品,每个仓库运送不同商品到不同买家的路费是不同的.问为了满足不同买家的订单的最小的花费. 思路: 设立一个源 ...
- POJ 2516 Minimum Cost (费用流)
题面 Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area ...
- POJ 2516 Minimum Cost 最小费用流 难度:1
Minimum Cost Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 13511 Accepted: 4628 Des ...
- POJ 2516 Minimum Cost(最小费用流)
Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his s ...
- POJ 2516 Minimum Cost (KM最优匹配)
题意:有N家家店,每家店都对K种货物有需求:同时有M家仓库,对K钟货物有供应.对于每种货物,每个仓库送至每家店都有自己的单位费用.求满足所有店所有货物的最小费用 分析:对于每一种货物,如果总需求大于总 ...
- POJ - 2516 Minimum Cost(最小费用最大流)
1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.K种物品拆开来,分别对每种物品 ...
随机推荐
- 解题:NOI 2009 管道取珠
题面 考虑这个平方的实际意义,实际是说取两次取出一样的序列 那么设$dp[i][j][k][h]$表示第一次在上面取$i$个下面取$j$个,第二次在上面取$k$个下面取$h$个的方案数 等等$n^4$ ...
- 2018 “百度之星”程序设计大赛 - 初赛(A)度度熊学队列 list rope
c++ list使用 #include <cstdio> #include <cstdlib> #include <cmath> #include <cstr ...
- 统计学习方法:CART算法
作者:桂. 时间:2017-05-13 14:19:14 链接:http://www.cnblogs.com/xingshansi/p/6847334.html . 前言 内容主要是CART算法的学 ...
- 利用solr实现商品的搜索功能
后期补充: 为什么要用solr服务,为什么要用luncence? 问题提出:当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据 ...
- HAOI2018游记
前言 很懒. 太懒了. 不仅懒得写题..连游记都懒得写.. 花点时间填一下坑吧..不过话说我去年的NOI/APIO/CTSC游记也没写.. 省选前 板子好像一早就打完了,没什么可干的. 也不愿意开新题 ...
- Git5:Git操作远程仓库
目录 说明 一.git clone 二.git remote 三.git fetch 四.git pull 五.git push 说明 Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个 ...
- Ansible9:条件语句
目录 一.when 1.基本用法 2.在when中使用jinja2的语法 3.使用bool值作为when的判断条件 4.在when中使用defined关键字 5.when在循环语句中的使用方法 6.在 ...
- 进化论VS中性突变理论
进化论VS中性突变理论 查尔斯·罗伯特·达尔文(英语:CharlesRobert Darwin,1809年2月12日-1882年4月19日),英国生物学家,其“进化论”被列为19世纪自然科学的三大发现 ...
- MySQL数据库语法-多表查询练习一
MySQL数据库语法-多表查询练习一 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍的多表查询的外键约束,以及如何使用外链接和内连接查询数据信息. 一.数据表和测试 ...
- PHP7 学习笔记(一)Ubuntu 16.04 编译安装Nginx-1.10.3、 PHP7.0.9、Redis3.0 扩展、Phalcon3.1 扩展、Swoole1.9.8 扩展、ssh2扩展(全程编译安装)
==================== PHP 7.0 编译安装================== wget http://cn2.php.net/get/php-7.0.9.tar.bz2/fr ...