首先对于一种商品

如果这种货不足需求就直接输出-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. fir.im 测试包下载工具--FIRReader 的图文介绍

    fir.im 是一个供开发者上传测试包(也可以是企业的正式包)的网站.该网站提供了接口访问应用资源.下面要介绍的这个应用对接了这些接口,供用户方便下载应用. 先来看下应用截图吧! 主要有以下功能点:1 ...

  2. spark[源码]-任务调度源码分析[三]

    前言 在上一篇文章中,我主要是讲解了DAG阶段的处理,spark是如何将一个job根据宽窄依赖划分出多个stage的,在最后一步中是将生成的TaskSet提交给了TaskSchedulerInmpl的 ...

  3. C++与C混编

    C++与C混编 本案例通过实现一个简单的UDP服务器来说明C++与C的混合编程问题 C代码 通过C代码来对UDP服务器的创建,监听进行封装 udp.c文件 #include <sys/types ...

  4. weblogic控制台部署web项目图解

    图解网址:http://jingyan.baidu.com/article/c74d6000650d470f6b595d72.html

  5. [转]总结一下CSS中的定位 Position 属性

    在CSS中,Position 属性经常会用到,主要是绝对定位和相对定位,简单的使用都没有问题,尤其嵌套起来,就会有些混乱,今记录总结一下,防止久而忘之. CSS position 属性值: absol ...

  6. Spring七大框架

    Spring Core:最基础部分,提供IOC和依赖注入.基础概念是BeanFactory,提供对Factory模式的经典实现,这样来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关 ...

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

    20145313张雪纯 <Java程序设计>7周学习总结 教材学习内容总结 1967年定义的国际原子时,将秒的国际单位定义为铯原子辐射振动9192631170周耗费的时间. 为了简化日后对 ...

  8. 《Java 程序设计》团队博客第十一周(第一次)

    <Java 程序设计>团队博客第十一周(第一次) 团队项目 1.项目内容.目标 项目内容 本组的团队项目准备实现一个有关于大富翁有的游戏程序. 大富翁游戏,以经营权为主要的游戏方式,通过购 ...

  9. MySQL优化具体

    1. 查询与索引优化分析 在优化MySQL时,通常需要对数据库进行分析,常见的分析手段有慢查询日志,profiling分析,EXPLAIN分析查询,以及show命令查询系统状态及系统变量,通过定位分析 ...

  10. 重新想,重新看——CSS3变形,过渡与动画①

    学习CSS3,觉得最难记忆的部分除了flex特性之外,就要属变形,过渡和动画部分了.作为初学者,总有种犯懒的心理,想着既然IE8浏览器都不完全支持CSS动画属性,还要考虑浏览器兼容问题,那么就不那么着 ...