首先对于一种商品

如果这种货不足需求就直接输出-1

剩下的就是KM算法

分k次分别计算每种商品的最小权值匹配

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,k,shop[][],sup[][],cost[][][],edges[][],cntA,cntB;
int belongA[],belongB[],A[],B[],visA[],visB[],mat[],d;
int dfs(int i)
{
visA[i]=;
for (int j=;j<=cntB;j++)
if (!visB[j]&&edges[i][j])
{
int t=edges[i][j]-A[i]-B[j];
if (!t)
{
visB[j]=;
if (!mat[j]||dfs(mat[j]))
{
mat[j]=i;
return ;
}
}
else d=min(d,t);
}
return ;
}
int match()
{
memset(A,0x3f,sizeof(A));
memset(B,,sizeof(B));
for (int i=;i<=cntA;i++)
for (int j=;j<=cntB;j++)A[i]=min(A[i],edges[i][j]);
memset(mat,,sizeof(mat));
for (int i=;i<=cntA;i++)
{
while ()
{
memset(visA,,sizeof(visA));
memset(visB,,sizeof(visB));
d=1e9;
if (dfs(i))break;
for (int j=;j<=cntA;j++)
if (visA[j]) A[j]+=d;
for (int j=;j<=cntB;j++)
if (visB[j]) B[j]-=d;
}
}
int ans=;
for (int i=;i<=cntB;i++)ans+=edges[mat[i]][i];
return ans;
}
int main()
{
while (~scanf("%d%d%d",&n,&m,&k),n+m+k)
{
for (int i=;i<=n;i++)
for (int j=;j<=k;j++)scanf("%d",&shop[i][j]);
for (int i=;i<=m;i++)
for (int j=;j<=k;j++)scanf("%d",&sup[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]);
int flag=;
for (int i=;i<=k;i++)
{
int need=,have=;
for (int j=;j<=n;j++)need+=shop[j][i];
for (int j=;j<=m;j++)have+=sup[j][i];
if (need>have)
{
flag=;
puts("-1");
break;
}
}
if (!flag)continue;
int ans=;
for (int t=;t<=k;t++)
{
cntA=cntB=;
for (int i=;i<=n;i++)
for (int j=;j<=shop[i][t];j++)belongA[++cntA]=i;
for (int i=;i<=m;i++)
for (int j=;j<=sup[i][t];j++)belongB[++cntB]=i;
for (int i=;i<=cntA;i++)
for (int j=;j<=cntB;j++)
edges[i][j]=cost[t][belongA[i]][belongB[j]];
ans+=match();
}
printf("%d\n",ans);
}
return ;
}

poj21516的更多相关文章

随机推荐

  1. 特性(property)/静态方法(staticmethod)/类方法(classmethod)/__str__的用法

    property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 1 import math 2 class Circle: 3 def __init__(self,radius): #圆的 ...

  2. 从HighGUI的一段代码中看OpenCV打开视频的方式

      OpenCV的HighGUI提供了视频和摄像头的直接打开.那么它是如何实现的了?这里进行初步分析.     ;    switch(apiPreference) {    default:    ...

  3. 20145313张雪纯 《Java程序设计》第1周学习总结

    20145313 <Java程序设计>第1周学习总结 教材学习内容总结 java有三大平台,分别为Java SE(J2SE).Java EE(J2EE).Java ME(J2 ME). J ...

  4. 20145314郑凯杰《信息安全系统设计基础》第9周学习总结 PART B

    20145314郑凯杰<信息安全系统设计基础>第9周学习总结 PART B 明确教材学习目标 注意每个系统调用的参数.返回值,会查帮助文档 阅读教材,完成课后练习(书中有参考答案),考核: ...

  5. IntelliJ IDEA 开发git多模块项目

    1.clone主项目 填写主仓库地址 2.在项目根目录,初始化子模块,并clone源码 git submodule init git submodule update 3.定位到各个子模块根目录,并切 ...

  6. 使用WebUploader实现文件批量上传,进度条显示功能

    知识点:利用WebUploader,实现文件批量上传,并且实时显示文件的上传进度 参考官方文档:http://fex.baidu.com/webuploader/ (1)引入三个资源 JS,CSS,S ...

  7. flume 1.7 安装与使用

    Flume安装 系统要求: 需安装JDK 1.7及以上版本 1. 下载二进制包 下载页面:http://flume.apache.org/download.html 1.7.0下载地址:http:// ...

  8. POJ - 3255 次短路径

    题意:给你无向带权图,求次短路径 题解:加一个次短路的数组,用于距记录源点到此点的次短路长度,注意初始化是源点到自己的次短路是极大值 接着再使用dijkstra算法,它是每次选用现在连上(记录了)的点 ...

  9. 哥德巴赫猜想-nefu2 & 分拆素数和 hdu2098

    哥德巴赫猜想-nefu2 & 分拆素数和 hdu2098 //哥德巴赫猜想 #include <iostream> #include <cmath> #include ...

  10. UVa 11396 爪分解(二分图判定)

    https://vjudge.net/problem/UVA-11396 题意: 给出n个结点的简单无向图,每个点的度数均为3.你的任务是判断能否把它分解成若干爪.每条边必须属于一个爪,但同一个点可以 ...