POJ 2516 Minimum Cost (KM最优匹配)
题意:有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最优匹配)的更多相关文章
- 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完备匹配)
题目链接:http://poj.org/problem?id=2516 题目大意: 第一行是N,M,K 接下来N行:第i行有K个数字表示第i个卖场对K种商品的需求情况 接下来M行:第j行有K个数字表示 ...
- POJ 2516 Minimum Cost [最小费用最大流]
题意略: 思路: 这题比较坑的地方是把每种货物单独建图分开算就ok了. #include<stdio.h> #include<queue> #define MAXN 500 # ...
随机推荐
- 【vijos】1768 顺序对的值(特殊的技巧)
https://vijos.org/p/1768 之前不知道为什么,我yy了一个n^2的做法,但是没能写出来..sad 然后看了题解才发现这题好神.. 为什么一定要照着题意找两个点然后算呢?这就是问题 ...
- linux软件的安装和卸载
http://blog.chinaunix.net/uid-25572546-id-1995028.html
- Office Developer Tools for Visual Studio 2012现在可用了
[原文发表地址] Now Available: Office Developer Tools for Visual Studio 2012 正如我以前写过的,我们正在为构建下一代Office和 S ...
- python实现抓取必应图片设置桌面
源码参考https://github.com/vbirds/pyWallpaper,代码风格不错 本人只是将其适配到python3.5,并消除一些bug,源代码中桌面地址未使用绝对路径导致win10 ...
- [转]廖雪峰Git教程总结
- 分布式服务框架dubbo入门实例
dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...
- Android studio Unsupported major.minor version 52.0
从目前以及我从网上搜索到的解决方案来说,出现此问题可以从以下两个方法入手: 1. JDK的版本和class版本不一致,通常是jdk版本过低解决方法: 1)使用Java -version和javac - ...
- Oracle中sql相关的命令
1.创建用户 SQL> -- 例如创建一个用户名为xiaoming,密码为a123的用户 SQL> create user xiaomingidentified by a123; 用户已创 ...
- JavaScript 学习(3)核心对象
##JavaScript 学习 3 1.核心对象 1.1 String对象 声明和生成 var myString="Hello"; var myString=new String( ...
- IO流入门-第五章-FileWriter
FileWriter基本用法和方法示例 /* java.io.Writer java.io.OutputStreamWriter 转换流(字节输出流--->字符输出流) java.io.File ...