Poj 2516 Minimum Cost (最小花费最大流)
题目链接:
题目描述:
有n个商店,m个仓储,每个商店和仓库都有k种货物。嘛!现在n个商店要开始向m个仓库发出订单了,订单信息为当前商店对每种货物的需求量。不同的商店从不同的仓库购买不同货物花费不同,问是不是能满足所有商店的要求,如果能商店花费总和最小为多少?
解题思路:
简单的费用流,要跑K次最小花费最大流,每次只对一种货物建图跑费用流。每次建图以0为源点, [1,m]为仓库, [m+1, n+m]为商店, n+m+1为汇点。0与[1,m]连边,边容量为仓库存货,边单位流量的花费为0。
[1,m]与[m+1,n+m]连边,边容量为INF,边单位流量的花费为对应仓库供应i货物给对应商店的单位花费。[m+1,n+m]与汇点连边,边容量为商店需求,边单位流量的花费为0。这个题目建图时候的初始化一定要搞好,不然很容易TLE。
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = ;
const int INF = 0x3f3f3f3f;
int flow[maxn][maxn], cap[maxn][maxn];
int shop[maxn][maxn], supply[maxn][maxn];
int vis[maxn], pre[maxn], dis[maxn], cost[maxn][maxn];
int c, Flow, s, e; bool spfa ()
{
queue <int> Q;
for (int i=s; i<=e; i++)
{
dis[i] = INF;
vis[i] = ;
}
dis[] = ;
vis[] = ;
Q.push (s);
while (!Q.empty())
{
int u = Q.front();
Q.pop();
vis[u] = ;
for (int v=s; v<=e; v++)
{
if (cap[u][v]>flow[u][v] && dis[v]>dis[u]+cost[u][v])
{
dis[v] = dis[u] + cost[u][v];
pre[v] = u;
if (!vis[v])
{
vis[v] = ;
Q.push(v);
}
}
}
}
if (dis[e] == INF)
return false;
return true;
} void MincostMaxflow ()
{
memset (flow, , sizeof(flow));
c = Flow = ;
while (spfa())
{
int Min = INF;
for (int i=e; i!=s; i=pre[i])
Min = min (Min, cap[pre[i]][i]-flow[pre[i]][i]);
for (int i=e; i!=s; i=pre[i])
{
flow[pre[i]][i] += Min;
flow[i][pre[i]] -= Min;
}
Flow += Min;
c += Min * dis[e];
}
} int main ()
{
int n, m, k;
while (scanf ("%d %d %d", &n, &m, &k), n||m||k)
{
int flag, Cost;
flag = Cost = s = , e = n + m + ; 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", &supply[i][j]); memset (cap, , sizeof(cap));
memset (cost, , sizeof(cost));
for (int i=; i<=m; i++)
for (int j=m+; j<=n+m; j++)
cap[i][j] = INF; for (int i=; i<=k; i++)
{
int total = ;
for (int j=; j<=n; j++)
for (int l=; l<=m; l++)
{
scanf ("%d", &cost[l][j+m]);
cost[j+m][l] = -cost[l][j+m];
} if (flag)
continue; for (int j=; j<=n; j++)
{
cap[j+m][e] = shop[j][i];
total += shop[j][i];
}
for (int j=; j<=m; j++)
cap[s][j] = supply[j][i]; MincostMaxflow();
if (Flow < total)
flag = ;
Cost += c; }
printf ("%d\n", flag?-:Cost);
}
return ;
}
Poj 2516 Minimum Cost (最小花费最大流)的更多相关文章
- POJ 2516 Minimum Cost [最小费用最大流]
题意略: 思路: 这题比较坑的地方是把每种货物单独建图分开算就ok了. #include<stdio.h> #include<queue> #define MAXN 500 # ...
- 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 (网络流,最小费用流)
POJ 2516 Minimum Cost (网络流,最小费用流) Description Dearboy, a goods victualer, now comes to a big problem ...
- POJ - 2516 Minimum Cost(最小费用最大流)
1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.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 ...
- POJ2516:Minimum Cost(最小费用最大流)
Minimum Cost Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19088 Accepted: 6740 题目链 ...
- 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(最小费用流)
Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his s ...
随机推荐
- datatable使用介绍
Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 1.支持分页:前台分页和后台分页 前台分页:后台一次把数据传过来,交给前端渲染.缺点 ...
- 利用百度地图Android sdk高仿微信发送位置功能
接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶 (假设须要完整demo.请评论留下邮箱) (眼下源代码已经不发送,假设须要源代码.加qq31 ...
- 【安卓笔记】抽屉式布局----DrawerLayout
效果例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hkamo=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- 算法导论—无向图的遍历(BFS+DFS,MATLAB)
华电北风吹 天津大学认知计算与应用重点实验室 最后改动日期:2015/8/22 无向图的存储方式有邻接矩阵,邻接链表,稀疏矩阵等. 无向图主要包括双方面内容,图的遍历和寻找联通分量. 一.无向图的遍历 ...
- 【ios系列】-Quartz 2D常用方法介绍
Quartz 2D基本介绍 Quartz 2D是一个二维绘图引擎 能够,绘制图形 : 线条\三角形\矩形\圆\弧等,绘制文字,绘制\生成图片(图像),读取\生成PDF,截图\裁剪图片,自定义UI控件( ...
- CXF+Spring+Tomcat 案例
多系统(异构系统)进行交互时,一种良好的方式便是调用Web Service,本示例基于Apache组织的CXF 环境:EclipseJDK6Tomcat6CXF2.6.1Spring3 示例项目结构图 ...
- C++明确规定,不能获取构造函数和析构函数的地址
C++标准明确规定,不能获取构造函数和析构函数的地址,因此也无法形成指向他们的成员函数指针. 指向成员函数的指针可以,指向构造函数析构函数的不行.因为构造函数和析构函数都是没有返回值的,无法声明一个没 ...
- CRM2011部署问题小结
1 CRM2011部署当插件太多,并且文件太多的时候选择硬盘部署 2 在生产环境这样复杂的CRM2011部署环境的时候弄清楚每台CRM服务器的结构是很重要的弟一步 3 一定要注意DMZ区和内网隔离的, ...
- Android 6.0 RK3288 ROM编译详解+命令详解【转】
本文转载自:http://blog.csdn.net/MLQ8087/article/details/58607692 Android 6.0 RK3288 ROM编译详解+命令详解 原创 2017年 ...
- JPEG库在Linux系统下的编译和移植【转】
本文转载自: 这篇文章介绍了jpeg库在Linux系统下的编译和移植,经过了亲自的验证,编译首先需要准备以下资源:jpegsrc.v6b.tar.gz(jpeg库),libtool-1.5.26.ta ...