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 ...
随机推荐
- 一处折腾笔记:Android内嵌html5加入原生微信分享的解决的方法
有一段时间没有瞎折腾了. 这周一刚上班萌主过来反映说:微信里面打开聚客宝.分享功能是能够的(这里是用微信自身的js-sdk实现的).可是在android应用里面打开点击就没反应了:接下来狡猾的丁丁在产 ...
- 系统重装 Ghost系统的disk to image等等是什么意思
localdiskto disk to imade from imagepartitionto partition to image from imagecheckimage file disk这些是 ...
- 三. 200多万元得到的创业教训--创业并不须要app
摘要:有个点子,研发app或站点,推广,不断改进,探索盈利模式.这个通用的移动互联网创业流程.但我觉得.在某些特定的商业模式下,"研发app或站点"这步能够砍掉或推迟. 健生干货分 ...
- 2016/2/26 <marquee></marquee>实现多种滚动效果
页面的自动滚动效果,可由javascript来实现,但是有一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制.使用marquee标记 ...
- 程序员的vim
1,所有的Unix like系统都会内建vi文书编辑器,其他的文书编辑器则不一定会存在,但是目前我们使用比较多的是vim编辑器 vim具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序 ...
- 提高比特率 有损 无损 Video-and-Audio-file-format-conversion 视频声音转码
3 Ways to Change Bitrate on MP3 Files https://www.online-tech-tips.com/software-reviews/change-bitra ...
- python爬虫爬取内容中,-xa0,-u3000的含义
python爬虫爬取内容中,-xa0,-u3000的含义 - CSDN博客 https://blog.csdn.net/aiwuzhi12/article/details/54866310
- Google Gson使用简介
1.Google Gson在android studio的使用 gradle:compile 'com.google.code.gson:gson:2.2.4' 2.Gson 注解 @Expose 注 ...
- jvm部分知识总结
1.jvm有三种执行模式,分别是解释执行,混合执行和编译执行,默认情况是混合执行模式. java version " Java(TM) SE Runtime Environment (bui ...
- Delphi XE10调用WebService服务获取图片验证码
最近做了一个程序,需要使用图片验证码,百度一下,网上一大把免费的WebService服务,随意找一个用用,效果还可以.WebService地址:http://www.webxml.com.cn/Web ...