kuangbin专题专题十一 网络流 Minimum Cost POJ - 2516
题目链接:https://vjudge.net/problem/POJ-2516
思路:对于每种商品跑最小费用最大流,如果所有商品和人一起建图跑,O(v^2*m)数量级太大,会超时。
把店里的商品拆点,入和出之间是商品库存量,起到限流作用。
源点->人对该商品的需求->库存点入->库存点出->汇点
源点与人之间的边的流为人的需求量,人对商品之间的边的流INF。
源点与人的边设置费用,其他边费用0.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std; const int N = ,INF = (int)1e9;
int n,m,k,tot;
int head[N<<],pre[N<<],d[N<<],vis[N<<];
int p[N][N],g[N][N],c[N][N][N];
struct node{
int to,nxt,cap,flow,cost;
}e[N*N]; inline void add(int u,int v,int cap,int flow,int cost){
e[tot].to = v; e[tot].cap = cap; e[tot].flow = flow;
e[tot].cost = cost; e[tot].nxt = head[u]; head[u] = tot++; e[tot].to = u; e[tot].cap = ; e[tot].flow = flow;
e[tot].cost = -cost; e[tot].nxt = head[v]; head[v] = tot++;
} void input(int& sum_need){
sum_need = ;
for(int i = ; i <= n; ++i){
for(int j = ; j <= k; ++j){
scanf("%d",&p[i][j]);
sum_need += p[i][j];
}
}
for(int i = ; i <= m; ++i){
for(int j = ; j <= k; ++j)
scanf("%d",&g[i][j]);
}
for(int o = ; o <= k; ++o){
for(int i = ; i <= n; ++i){
for(int j = ; j <= m; ++j)
scanf("%d",&c[o][i][j]);
}
}
} void build_map(int o,int s,int t){
//0源点 1~n人 n+1~n+m 库存点入,
//n+m+1~n+2*m库存点出 n+2*m+1汇点。
for(int i = ; i <= n; ++i){
for(int j = ; j <= m; ++j){
add(i,j+n,INF,,c[o][i][j]);
}
}
for(int i = ; i <= n; ++i){
add(s,i,p[i][o],,);
}
for(int i = ; i <= m; ++i){
add(i+n,i+n+m,g[i][o],,);
add(i+n+m,t,INF,,);
}
} bool spfa(int s,int t){
for(int i = s; i <= t; ++i){
d[i] = INF; pre[i] = -; vis[i] = false;
}
queue<int > que;
que.push(s); d[s] = ; vis[s] = true;
while(!que.empty()){
int now = que.front(); que.pop();
vis[now] = false;
for(int o = head[now]; ~o; o = e[o].nxt){
int to = e[o].to;
if(e[o].cap > e[o].flow && d[to] > d[now] + e[o].cost){
d[to] = d[now] + e[o].cost;
pre[to] = o;
if(!vis[to]){
vis[to] = true;
que.push(to);
}
}
}
}
if(pre[t] == -) return false;
else return true;
} int mcmf(int s,int t,int& mf){ int Min = INF,mc = ;
while(spfa(s,t)){
Min = INF;
for(int o = pre[t]; ~o; o = pre[e[o^].to]){
Min = min(Min,e[o].cap - e[o].flow);
}
for(int o = pre[t]; ~o; o = pre[e[o^].to]){
e[o].flow += Min;
e[o^].flow -= Min;
}
mf += Min;
mc += d[t]*Min;
}
return mc;
} void init_main(){
memset(p,,sizeof(p));
memset(g,,sizeof(g));
memset(c,,sizeof(c));
} int main(){ int s,t,mc,mf,sum_need;//商品总需求量
while(~scanf("%d%d%d",&n,&m,&k) && (n+m+k)){
init_main();
input(sum_need);
s = ; t = n + *m + ;
mc = mf = ;
for(int o = ; o <= k; ++o){//第o种商品
for(int i = s; i <= t; ++i) head[i] = -; tot = ;
build_map(o,s,t);
mc += mcmf(s,t,mf);
}
//if(mf == sum_need) printf("-------------%d\n",mc);
//else printf("--------------no\n");
if(mf == sum_need) printf("%d\n",mc);
else printf("-1\n");
} return ;
}
kuangbin专题专题十一 网络流 Minimum Cost POJ - 2516的更多相关文章
- E - Minimum Cost - POJ 2516(最小费)
题目大意:N个客户,M个供货商,K种商品,现在知道每个客户对每种商品的需求量,也知道每个供货商每种商品的持有量,和供货商把一种商品运送到每个客户的单位花费.现在想知道如果能满足所有客户的最小花费是多少 ...
- Minimum Cost POJ - 2516(模板题。。没啥好说的。。)
题意: 从发货地到商家 送货 求送货花费的最小费用... 有m个发货地,,,n个商家,,每个商家所需要的物品和物品的个数都不一样,,,每个发货地有的物品和物品的个数也不一样,,, 从不同的发货地到不同 ...
- Minimum Cost POJ - 2516 (模板题 spfa最小费用最大流)
题意: 人回家,一步一块钱,有x个人,y个房子,求能回家的最大人数且使之费用最小 解析: 就是....套模板,,,, 建图(⊙﹏⊙)...要仔细观察呐 对于人拆不拆都可以 都能过,,,,这里贴上拆开 ...
- kuangbin专题专题十一 网络流 Going Home POJ - 2195
题目链接:https://vjudge.net/problem/POJ-2195 思路:曼哈顿距离来求每个人到每个房间的距离,把距离当作费用. 就可以用最小费用最大流来解决了,把每个房子拆成两个点,限 ...
- [kuangbin带你飞]专题十一 网络流
ID Origin Title 34 / 81 Problem A POJ 3436 ACM Computer Factory 92 / 195 Problem B POJ 3 ...
- Kuangbin 带你飞专题十一 网络流题解 及模版 及上下界网络流等问题
首先是几份模版 最大流:虽然EK很慢但是优势就是短.求最小割的时候可以根据增广时的a数组来判断哪些边是割边.然而SAP的最大流版我只会套版,并不知道该如何找到这个割边.在尝试的时候发现了一些问题.所以 ...
- [kuangbin带你飞]专题十一 网络流个人题解(L题留坑)
A - ACM Computer Factory 题目描述:某个工厂可以利用P个部件做一台电脑,有N个加工用的机器,但是每一个机器需要特定的部分才能加工,给你P与N,然后是N行描述机器的最大同时加工数 ...
- POJ 2516 Minimum Cost (网络流,最小费用流)
POJ 2516 Minimum Cost (网络流,最小费用流) Description Dearboy, a goods victualer, now comes to a big problem ...
- Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)
Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
随机推荐
- Day6前端学习之路——布局
一.定位 1)静态定位 position:static(默认) 2)相对定位 position:relative(要配合top.bottom.left.right等属性来使用) 3)绝对定位 pos ...
- asp.net MVC项目开发之统计图echarts饼形图(二)
上面介绍了柱状图,只有js代码后台的传递等我们介绍完饼形图的使用过程在做介绍 有了柱状图的介绍,在使用饼形图,其实很容易了,上代码 1.首先加载网页时,需要用到的加载项和事件. //打开网页加载 $( ...
- 1,Python爬虫环境的安装
前言 很早以前就听说了Python爬虫,但是一直没有去了解:想着先要把一个方面的知识学好再去了解其他新兴的技术. 但是现在项目有需求,要到网上爬取一些信息,然后做数据分析.所以便从零开始学习Pytho ...
- jquery二级导航
效果图 直接放代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 表关联使用INNER JOIN实现更新功能
准备一些数据,创建2张表,表1为学生表: CREATE TABLE [dbo].[Student] ( [SNO] INT NOT NULL PRIMARY KEY, ) NOT NULL, ,) N ...
- C#_.net core 3.0自定义读取.csv文件数据_解决首行不是标题的问题_Linqtocsv改进
linqtocsv文件有不太好的地方就是:无法设置标题的行数,默认首行就是标题,这不是很尴尬吗? 并不是所有的csv文件严格写的首行是标题,下面全是数据,我接受的任务就是读取很多.csv报表数据, ...
- java基础之----23种设计模式(单例模式)
概述 提到单例模式,我们并不陌生,而且面试中也常常会问单例模式相关的问题,接下来就谈谈单例模式,这篇文章会回答如下几个问题: 什么是单例模式? 单例模式有几种实现方式,以及各种实现方式的优劣? 单例模 ...
- C# MVC Api无法获得参数
在MVC中写API时,没有收到参数如何解决? 通过jQuery.POST测试成功.后来又通过F12发送,发现始终无法收到参数. 注:我的接口接收参数是一个类对象,没有写[FromBody]) [Htt ...
- 防止或减少过拟合的方式(二)——Dropout
当进行模型训练的时候,往往可能错过模型的最佳临界点,即当达到最大精度的时候再进行训练,测试集的精度会下降,这时候就会出现过拟合,如果能在其临界点处提前终止训练,就能得到表达力较强的模型,从而也避免了过 ...
- 数据库MySQL中关于“多表关联更新”的那些事
在常见的sql中,我们经常在查询中进行多表关联查询,用的比较熟练.今天在开发中遇到一个实际业务场景是多表关联更新,一时不知所措.本着多学习的态度,没有直接写java代码去实现,终于把多表关联更新的sq ...