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 # ...
随机推荐
- Java1.0的AWT(旧AWT)和Java1.1以后的AWT(新AWT)有着很大的区别
Java1.0的AWT(旧AWT)和Java1.1以后的AWT(新AWT)有着很大的区别,新的AWT克服了旧AWT的很多缺点,在设计上有较大改进,使用也更方便,这里主要介绍新的AWT, 但在Java1 ...
- 嵌入式开发之信号采集同步---VSYNC和HSYNC的作用以及它们两者之间的关系
VSYNC和HSYNC的作用以及它们两者之间的关系 VSYNC和HSYNC的作用以及它们两者之间的关系 VSYNC和HSYNC是什么 VSYNC: vertical synchronization,指 ...
- Android上传图片(PHP服务器)
原理 Android客户端模拟一个HTTP的Post请求到服务器端,服务器端接收相应的Post请求后,返回响应信息给给客户端. PHP服务器 <?php move_uploaded_file($ ...
- CNN 各layer汇总
Flattening:类型为:Flatten 基于某个axis进行偏平的意思,如 axis = 1 ,fattens an input of shape n * c * h * w to a simp ...
- SurvivalShooter学习笔记(四.敌人攻击)
此案例中,敌人始终朝着玩家移动 到达攻击玩家范围时(身上的大的触发器被玩家触发时(敌人靠近玩家,当身上的触发器被触发,且对象是玩家时条件达成)) 隔一个时间端,打击玩家一下,对玩家造成伤害,玩家掉血, ...
- SQL Server Profiler的简单使用(监控mssql)
SQL Server Profiler可以检测在数据上执行的语句,特别是有的项目不直接使用sql语句,直接使用ORM框架的系统处理数据库的项目,在调试sql语句时,给了很大的帮助. 之前写了使用SQL ...
- mysql 暴力破解 root账号密码
测试数据库的root账号密码大家都忘记了,好吧,那我们就暴力破解吧 1.找到my.cnf vi /etc/my.cnf在[mysqld]的段中加上一句:skip-grant-tables例如:[mys ...
- 第三篇:POSIX标准中的 “ 限制 ”
前言 在POSIX标准中,定义了许多限制.这些限制大约分为五类,不同类型的限制获取的方式不一样. 限制值分类 1. 不变的最小值 这类型的限制值是静态的,固定的. 2. 不变值 同上 3. 运行时可以 ...
- centos6.5下安装samba服务器与配置
转自:http://www.centoscn.com/CentosServer/ftp/2014/1023/3989.html http://www.cnblogs.com/x_wukong/p/56 ...
- 第一只python爬虫
import urllib.request response = urllib.request.urlopen("http://www.baidu.com") html = res ...