传送门:poj.org/problem?id=2516

题意:

  有m个仓库,n个买家,k个商品,每个仓库运送不同商品到不同买家的路费是不同的。问为了满足不同买家的订单的最小的花费。

思路:

  设立一个源点S和汇点T,从源点S到每个仓库(1~m)连上容量为商品A的库存、费用为0的边,每个仓库再向每个不同的买家连上容量inf,费用为路费的边、每个顾客向汇点连一条容量为自己对商品A的需求个数、费用为0的边。跑一边费用流即可。这只有运送一个商品的费用,对,那我们就对不同商品建不同的图,一共跑K边,累计答案即可。

  自己一直在想建图,怎么一次就跑出费用。感觉上面的思路和多开一维的观点差不多。

//#pragma GCC optimize(3)
//#pragma comment(linker, "/STACK:102400000,102400000") //c++
// #pragma GCC diagnostic error "-std=c++11"
// #pragma comment(linker, "/stack:200000000")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
// #pragma GCC optimize("-fdelete-null-pointer-checks,inline-functions-called-once,-funsafe-loop-optimizations,-fexpensive-optimizations,-foptimize-sibling-calls,-ftree-switch-conversion,-finline-small-functions,inline-small-functions,-frerun-cse-after-loop,-fhoist-adjacent-loads,-findirect-inlining,-freorder-functions,no-stack-protector,-fpartial-inlining,-fsched-interblock,-fcse-follow-jumps,-fcse-skip-blocks,-falign-functions,-fstrict-overflow,-fstrict-aliasing,-fschedule-insns2,-ftree-tail-merge,inline-functions,-fschedule-insns,-freorder-blocks,-fwhole-program,-funroll-loops,-fthread-jumps,-fcrossjumping,-fcaller-saves,-fdevirtualize,-falign-labels,-falign-loops,-falign-jumps,unroll-loops,-fsched-spec,-ffast-math,Ofast,inline,-fgcse,-fgcse-lm,-fipa-sra,-ftree-pre,-ftree-vrp,-fpeephole2",3) #include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert> using namespace std;
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef unsigned long long ull;
//typedef __int128 bll;
typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3; //priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define OKC ios::sync_with_stdio(false);cin.tie(0)
#define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
#define REP(i , j , k) for(int i = j ; i < k ; ++i)
#define max3(a,b,c) max(max(a,b), c);
//priority_queue<int ,vector<int>, greater<int> >que; const ll mos = 0x7FFFFFFF; //
const ll nmos = 0x80000000; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //
const int mod = 1e9+;
const double esp = 1e-;
const double PI=acos(-1.0);
const double PHI=0.61803399; //黄金分割点
const double tPHI=0.38196601; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} /*-----------------------showtime----------------------*/
const int maxn = ;
int n,m,k,x;
int req[maxn][maxn],hav[maxn][maxn],fy[maxn][maxn][maxn];
int res[maxn]; const int maxl = 1e6+;
struct Edge{
int to,val,cost,nxt;
}gEdge[maxl]; int h[maxn],gPre[maxn];
int gPath[maxl],gDist[maxn];
bool in[maxn];
int gcount = ; bool spfa(int s,int t){
memset(gPre,-,sizeof(gPre));
memset(gDist, inf,sizeof(gDist));
memset(in, false, sizeof(in)); gDist[s] = ; in[s] = true;
queue<int>q;
q.push(s);
while(!q.empty()){
int u = q.front();
q.pop(); in[u] = false;
for(int e = h[u]; e!=-;e = gEdge[e].nxt){
int v = gEdge[e].to, w = gEdge[e].cost;
if(gEdge[e].val > && gDist[v] > gDist[u] + w){
gDist[v] = gDist[u] + gEdge[e].cost;
gPre[v] = u;
gPath[v] = e;
if(!in[v]){
q.push(v); in[v] = true;
}
}
}
}
return gPre[t] != -;
}
int MinCostFlow(int s,int t,int nd){
int cost = ,flow = ;
while(spfa(s,t)){
int f = inf;
for(int u=t; u!=s; u = gPre[u]){
if(gEdge[gPath[u]].val < f){
f = gEdge[gPath[u]].val;
}
}
flow +=f;
cost += gDist[t]*f;
for(int u=t; u!=s; u=gPre[u]){
gEdge[gPath[u]].val -= f;
gEdge[gPath[u]^].val += f;
}
}
if(flow != nd){
return -;
}
return cost;
} void addedge(int u,int v,int val,int cost){
gEdge[gcount].to = v;
gEdge[gcount].val = val;
gEdge[gcount].cost = cost;
gEdge[gcount].nxt = h[u];
h[u] = gcount++; gEdge[gcount].to = u;
gEdge[gcount].val = ;
gEdge[gcount].cost = -cost;
gEdge[gcount].nxt = h[v];
h[v] = gcount++;
}
int main(){
while(~scanf("%d%d%d", &n, &m, &k) && n+m+k){ memset(req,,sizeof(req));
memset(hav,,sizeof(hav));
memset(res, ,sizeof(res)); for(int i=; i<=n; i++)
for(int j=; j<=k; j++)
scanf("%d", &req[i][j]),res[j] += req[i][j]; for(int i=; i<=m; i++)
for(int j=; j<=k; j++)
{
scanf("%d", &hav[i][j]);
}
for(int i=; i<=k; i++)
for(int t = ; t<=n; t++)
for(int j=; j<=m; j++)
{
scanf("%d",&fy[i][j][t]);
}
int ans = ,kk = k,flag = ;
int s = ,t = n+m+;
for(int kind = ; kind <= k; kind ++){
memset(h,-,sizeof(h));
gcount = ;
for(int i=; i<=m; i++) addedge(s,i,hav[i][kind],);
for(int i=; i<=m; i++)
for(int j=; j<=n; j++){
addedge(i,m+j,inf,fy[kind][i][j]);
}
for(int i=; i<=n; i++){
addedge(m+i,t, req[i][kind],);
}
int tmp = MinCostFlow(s,t,res[kind]);
if(tmp == -) flag = ;
else ans += tmp;
}
if(flag == )puts("-1");
else
printf("%d\n", ans);
}
return ;
}

POJ 2516

POJ - 2516 Minimum Cost 每次要跑K次费用流的更多相关文章

  1. POJ 2516 Minimum Cost (网络流,最小费用流)

    POJ 2516 Minimum Cost (网络流,最小费用流) Description Dearboy, a goods victualer, now comes to a big problem ...

  2. Poj 2516 Minimum Cost (最小花费最大流)

    题目链接: Poj  2516  Minimum Cost 题目描述: 有n个商店,m个仓储,每个商店和仓库都有k种货物.嘛!现在n个商店要开始向m个仓库发出订单了,订单信息为当前商店对每种货物的需求 ...

  3. POJ 2516 Minimum Cost (最小费用最大流)

    POJ 2516 Minimum Cost 链接:http://poj.org/problem?id=2516 题意:有M个仓库.N个商人.K种物品.先输入N,M.K.然后输入N行K个数,每一行代表一 ...

  4. POJ 2516 Minimum Cost (费用流)

    题面 Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area ...

  5. POJ 2516 Minimum Cost 最小费用流

    题目: 给出n*kk的矩阵,格子a[i][k]表示第i个客户需要第k种货物a[i][k]单位. 给出m*kk的矩阵,格子b[j][k]表示第j个供应商可以提供第k种货物b[j][k]单位. 再给出k个 ...

  6. POJ 2516 Minimum Cost 最小费用流 难度:1

    Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 13511   Accepted: 4628 Des ...

  7. POJ 2516 Minimum Cost(最小费用流)

    Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his s ...

  8. POJ - 2516 Minimum Cost(最小费用最大流)

    1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.K种物品拆开来,分别对每种物品 ...

  9. POJ 2516 Minimum Cost(拆点+KM完备匹配)

    题目链接:http://poj.org/problem?id=2516 题目大意: 第一行是N,M,K 接下来N行:第i行有K个数字表示第i个卖场对K种商品的需求情况 接下来M行:第j行有K个数字表示 ...

随机推荐

  1. Linux系统管理----磁盘管理与文件系统

    1.为主机新增两块30GB的SCSI硬盘 找到要添加的虚拟机,单击鼠标右键,点击设置 点击添加 选择硬件类型,然后点击下一步 选择要创建的磁盘类型,然后点击下一步 指定要创建磁盘的容量,然后点击下一步 ...

  2. 【Mac】nsurlsessiond 后台下载问题的解决方法

    最近在使用 Mac 系统的时候,经常发现 nsurlsessiond 这个进程,一直在后台下载,非常占用网速.解决方案如下: 通过终端执行下面的语句可以停止后台的自动更新: #!/bin/sh lau ...

  3. Codeforces Round #192 (Div. 2) (329A)C.Purification

    题意: 在一个正常的点可以净化该行该列的所有细胞,判断是否可以净化所有的细胞,并且输出所选的点. 思路: 如果可以的话,一定会选n个点. 先判断每一行是否有正常细胞,然后判断每一列是否有,如果都没有肯 ...

  4. Something wrong with EnCase v8 index search results

    My friend told me that she installed EnCase v8.05 on her workstation which OS version is Win 10. She ...

  5. Fork 多进程 模拟并行访问web service获取响应时间差

    #include <ros/ros.h> #include <iostream> #include <string> #include <cstring> ...

  6. java基础精选题

    Integer比较 看下面这段有意思的代码,对数字比较敏感的小伙伴有没有发现异常? public static void main(String[] args) { Integer a = 128,b ...

  7. 【Java例题】7.4 文件题1-学生成绩排序

    4.学生成绩排序.已有一个学生成绩文件,含有多位学生的成绩:读取这个文件中的每位学生的成绩,然后排序:最后将这些排好序的成绩写到另一个文件中. package chapter7; import jav ...

  8. java并发编程(十五)----(线程池)java线程池简介

    好的软件设计不建议手动创建和销毁线程.线程的创建和销毁是非常耗 CPU 和内存的,因为这需要 JVM 和操作系统的参与.64位 JVM 默认线程栈是大小1 MB.这就是为什么说在请求频繁时为每个小的请 ...

  9. hadoop的基础思想

    转载 http://www.superwu.cn/2014/01/10/963 1.1.1. hadoop的核心思想 Hadoop包括两大核心,分布式存储系统和分布式计算系统.1.1.1.1. 分布式 ...

  10. Markdown的最常用标记符号

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. md就是markdown 如果你要把这段文字定义成标题,只需要在前面加上一个#号, ...