题意:有N家家店,每家店都对K种货物有需求;同时有M家仓库,对K钟货物有供应。对于每种货物,每个仓库送至每家店都有自己的单位费用。求满足所有店所有货物的最小费用

分析:对于每一种货物,如果总需求大于总费用,那么无解的;否则可以用KM匹配求解每一种货物的最小费用。

因为KM求的是最优匹配,所以建图的时候,建负权边即可。

将每一份需求和每一份供应都离散化,而不是把一个店的需求和每个一仓库的供应建立边。

#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int maxn =;
const int INF= ; int w[maxn][maxn];
int m,n;//n左m右
int cx[maxn],cy[maxn];//顶标
bool usex[maxn],usey[maxn];//本回合使用的x,y
int link[maxn];//link[i]=x代表:在y图中的i与x相连 int A,B; bool dfs(int u){
usex[u]=;
for(int i=;i<=B;i++)
if(!usey[i]&&cx[u]+cy[i]==w[u][i]){
usey[i]=;
if(link[i]==-||dfs(link[i])){
link[i]=u;
return ;
}
}
return ;
}
int KM(){
memset(cy,,sizeof(cy));
memset(cx,-,sizeof(cx));
memset(link,-,sizeof(link));
for(int i=;i<=A;i++)
for(int j=;j<=B;j++)
cx[i]=max(cx[i],w[i][j]);
for(int i=;i<=A;i++){
while(){
int d=INF;
memset(usex,,sizeof(usex));
memset(usey,,sizeof(usey));
if(dfs(i))break;
for(int i=;i<=A;i++)
if(usex[i])
for(int j=;j<=B;j++)
if(!usey[j])d=min(d,cx[i]+cy[j]-w[i][j]);
if(d==INF)return -;
for(int i=;i<=A;i++)
if(usex[i])cx[i]-=d;
for(int i=;i<=B;i++)
if(usey[i])cy[i]+=d;
}
} int ans=;
for(int i=;i<=B;i++){
if(~link[i]){
ans -= w[link[i]][i];
}
}
return ans;
} int nd[maxn][maxn];
int sp[maxn][maxn];
int ct[maxn][maxn][maxn];
int cas; int cnt1[maxn],cnt2[maxn]; int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int T,tmp;
int u,v,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",&nd[i][j]);
}
} for(int i=;i<=m;++i){
for(int j=;j<=k;++j){
scanf("%d",&sp[i][j]);
}
} for(int i=;i<=k;++i){
for(int j=;j<=n;++j){
for(int t = ;t<=m;++t){
scanf("%d",&ct[i][j][t]);
}
}
} bool flag = true;
for(int cas=;cas<=k;++cas){
int need = ,supply =;
for(int i=;i<=n;++i) need += nd[i][cas];
for(int i=;i<=m;++i) supply += sp[i][cas];
if(need>supply){
flag = false;
break;
}
} if(!flag){
puts("-1");
continue;
} int tot = ;
for(int cas = ;cas<=k;++cas){
A=B=;
for(int i=;i<=n;++i){
for(int j=;j<=nd[i][cas];++j){
cnt1[++A] = i;
}
}
for(int i=;i<=m;++i){
for(int j=;j<=sp[i][cas];++j){
cnt2[++B] = i;
}
}
for(int i=;i<=A;++i){
for(int j=;j<=B;++j){
w[i][j] = -ct[cas][cnt1[i]][cnt2[j]];
}
}
int tmp = KM();
tot+=tmp;
}
printf("%d\n",tot);
}
return ;
}

POJ 2516 Minimum Cost (KM最优匹配)的更多相关文章

  1. POJ 2516 Minimum Cost (网络流,最小费用流)

    POJ 2516 Minimum Cost (网络流,最小费用流) Description Dearboy, a goods victualer, now comes to a big problem ...

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

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

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

    POJ 2516 Minimum Cost 链接:http://poj.org/problem?id=2516 题意:有M个仓库.N个商人.K种物品.先输入N,M.K.然后输入N行K个数,每一行代表一 ...

  4. POJ - 2516 Minimum Cost 每次要跑K次费用流

    传送门:poj.org/problem?id=2516 题意: 有m个仓库,n个买家,k个商品,每个仓库运送不同商品到不同买家的路费是不同的.问为了满足不同买家的订单的最小的花费. 思路: 设立一个源 ...

  5. POJ 2516 Minimum Cost (费用流)

    题面 Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area ...

  6. POJ 2516 Minimum Cost 最小费用流 难度:1

    Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 13511   Accepted: 4628 Des ...

  7. POJ 2516 Minimum Cost(最小费用流)

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

  8. POJ 2516 Minimum Cost(拆点+KM完备匹配)

    题目链接:http://poj.org/problem?id=2516 题目大意: 第一行是N,M,K 接下来N行:第i行有K个数字表示第i个卖场对K种商品的需求情况 接下来M行:第j行有K个数字表示 ...

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

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

随机推荐

  1. abp项目如何按业务功能模块横向分割?

    1.为什么要做分层? 请先看项目分层的最后结构: 2.设计的初衷 项目较大,且主题鲜明,分为:BI模块.DM-用户洞察模块.Manage-应用管理模块.Report应用分析报表模块,大模块之间并无依赖 ...

  2. 【Debian】install

    n年前的报废台式机实在不能忍受xp的速度,果断装Linux近期家里的小本装了Ubuntu14.04 ,实在不习惯最新的图形界面.装个debian试试吧. 1.专门弄一个空白分区2.官网下载debian ...

  3. 【Raspberry Pi】DHT11 温度湿度传感器数据读取

    时序图参考厂家说明书:DHT11数字湿温度传感器的原理和应用范例 四个阵脚连接:VCC接3.3伏电源,Dout接GPIO口,我接的是物理12针脚,NC留空,GND接地. 波折1:电阻被错接进了VCC, ...

  4. ShadowCaster 代码

    Pass { Name "ShadowCaster" Tags{"LightMode" = "ShadowCaster"} CGPROGRA ...

  5. apache 一个站点配置多个域名

      <VirtualHost *:80> ServerAdmin i@kuigg.com DocumentRoot /www/kuigg.com ServerName kuigg.com ...

  6. xml html xhtml html5

    1.XML 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 X ...

  7. python 之 多进程

    阅读目录 1. Process 2. Lock 3. Semaphore 4. Event 5. Queue 6. Pipe 7. Pool 序. multiprocessingpython中的多线程 ...

  8. golang 内置函数new()

    new() 这是一个用来分配内存的内置函数,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配的 t 类型的零值的指针. 在golang的代码定义如下: func new(t Type) ...

  9. cxGrid 循环选择条目

    Delphi DevExpress CxGrid 循环选择条目 整理出来的,直接复制粘贴即可使用 以下是从网络上复制粘帖到的,实践证明,利用以下代码进行获取选择行是错误的. 当我们利用 CxGrid进 ...

  10. POJ 2773 Happy 2006(容斥原理+二分)

    Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10827   Accepted: 3764 Descr ...