题意好长。。。。变量好多。。。。

增加源点跟汇点。然后将每个月份看成一个点,然后拆成两个点u 跟 u+n。

从s向每个u连一条<n[u], m[i]>的弧,表示最多生产量及价值。

从每个u+n向t连一条<s[i], -p[i]>的弧,表示最多销量及价值。

对于存放的情况 for(int j=0; j<=e[u] ; j++) if(u + j <= M) ,由u向u+j+M连一条<INF, I*j>的弧,表示存放所要花费的价值。

这题并不需要满足销量最大,也就是不固定流量的最小费用流,也就是说当s-t增广长度大于0的时候停止增广就行了。还有,稠密图ZKW效率不是太高。。。。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#define REP(i, n) for(int i=0; i<n; i++)
#define CLR(a, b) memset(a, b, sizeof(a))
#define FF(i, a, b) for(int i=a; i<b; i++)
#define LL long long
using namespace std; const int maxn = 300;
const int maxe = maxn*maxn/2;
const int INF = 1e9; struct ZKW_flow
{
int st, ed, ecnt, n;
int head[maxn], dis[maxn];
int cap[maxe], cost[maxe], to[maxe], next[maxe]; void init()
{
CLR(head, 0);
ecnt = 2;
} void AddEdge(int u, int v, int cc, int ww)
{
cap[ecnt] = cc; cost[ecnt] = ww; to[ecnt] = v;
next[ecnt] = head[u]; head[u] = ecnt++;
cap[ecnt] = 0; cost[ecnt] = -ww; to[ecnt] = u;
next[ecnt] = head[v]; head[v] = ecnt++;
} void spfa()
{
REP(i, n+1) dis[i] = INF;
priority_queue<pair<int, int> > q;
dis[st] = 0;
q.push(make_pair(0, st));
while(!q.empty())
{
int u = q.top().second, d = -q.top().first;
q.pop();
if(dis[u] != d) continue;
for(int p=head[u]; p; p=next[p])
{
int& v = to[p];
if(cap[p] && dis[v] > d+cost[p])
{
dis[v] = d + cost[p];
q.push(make_pair(-dis[v], v));
}
}
}
REP(i, n+1) dis[i] = dis[ed] - dis[i];
}
LL Mincost, Maxflow;
bool use[maxn]; int add_flow(int u, int flow)
{
if(u == ed)
{
if(dis[st] > 0) return flow;//不固定流量的最小费用流
Maxflow += flow;
Mincost += (LL)dis[st] * (LL)flow;
return flow;
}
use[u] = true;
int now = flow;
for(int p=head[u]; p; p=next[p])
{
int& v = to[p];
if(cap[p] && !use[v] && dis[u] == dis[v] + cost[p])
{
int tmp = add_flow(v, min(now, cap[p]));
cap[p] -= tmp;
cap[p^1] += tmp;
now -= tmp;
if(!now) break;
}
}
return flow - now;
} bool modify_lable()
{
int d = INF;
REP(u, n+1) if(use[u])
for(int p=head[u]; p; p=next[p])
{
int& v = to[p];
if(cap[p] && !use[v])
d = min(d, dis[v] + cost[p] - dis[u]);
}
if(d == INF) return false;
REP(i, n+1) if(use[i]) dis[i] += d;
return true;
} LL MCMF(int ss, int tt, int nn)
{
st = ss; ed = tt; n = nn;
Mincost = Maxflow = 0;
spfa();
while(true)
{
while(true)
{
CLR(use, 0);
if(!add_flow(st, INF)) break;
}
if(!modify_lable()) break;
}
return Mincost;
}
}solver; int T, M, I, st, ed;
int m[maxn], n[maxn], p[maxn], s[maxn], e[maxn]; int main()
{
scanf("%d", &T);
FF(kase, 1, T+1)
{
scanf("%d%d", &M, &I);
solver.init();
st = 0, ed = M * 2 + 1;
FF(i, 1, M+1) scanf("%d%d%d%d%d", &m[i], &n[i], &p[i], &s[i], &e[i]); FF(i, 1, M+1)
{
solver.AddEdge(st, i, n[i], m[i]);
solver.AddEdge(i+M, ed, s[i], -p[i]);
REP(j, e[i]+1) if(i + j <= M)
solver.AddEdge(i, i+j+M, n[i], I*j);
else break;
} printf("Case %d: %lld\n", kase, -solver.MCMF(st, ed, ed));
}
return 0;
}

UVA 11613 Acme Corporation(不固定流量的最小费用流)的更多相关文章

  1. Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负

    /** 题目:Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负 链接:https://vjudge.net/problem/UVA-1161 ...

  2. UVA11613 Acme Corporation —— 最小费用流(流量不固定的最小费用流)

    题目链接:https://vjudge.net/problem/UVA-11613 题意: 商品X在第i个月内:生产一件需要花费mi元,最多可生产ni件,销售一件(在这个月内销售,而不管它是在那个月生 ...

  3. Acme Corporation UVA - 11613 费用流

    Code: #include<cstdio> #include<cstring> #include<vector> #include<queue> #i ...

  4. UVA 11248 - Frequency Hopping(网络流量)

    UVA 11248 - Frequency Hopping 题目链接 题意:给定一个网络,如今须要从1到N运输流量C,问是否可能,假设可能输出可能,假设不可能,再问能否通过扩大一条边的容量使得可能,假 ...

  5. UVa11613 Acme Corporation(最小费用流)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33452 [思路] 最小费用流. 构图: 1 每个月建立2个点,建立 ...

  6. UVA-11613 Acme Corporation (最大费用最大流+拆点)

    题目大意:有一种商品X,其每每单位存放一个月的代价I固定.并且已知其每月的最大生产量.生产每单位的的代价.最大销售量和销售单价,还已知每个月生产的X能最多能存放的时间(以月为单位).问只考虑前m个月, ...

  7. UVA 1659 Help Little Laura 帮助小劳拉 (最小费用流,最小循环流)

    (同时也是HDU 2982,UVA的数据多) 题意:平面上有m条有向线段连接了n个点.你从某个点出发顺着有向线段行走,给走过的每条线段涂一种不同的颜色,最后回到起点.你可以多次行走,给多个回路涂色(要 ...

  8. UVa1658 Admiral(拆点法+最小费用流)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51253 [思路] 固定流量的最小费用流. 拆点,将u拆分成u1和u ...

  9. OC编程之道-创建对象之抽象工厂方法

    定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类.       <AbstractProductA> <AbstractProductB> <Ab ...

随机推荐

  1. vue-cli之webpack的proxyTable无效的解决方案

    最近遇到这个需要单页访问跨域后台的问题 可以按照如下设置: proxyTable: { '/list': { target: 'http://api.xxxxxxxx.com', pathRewrit ...

  2. 11:django 模板 内建标签

    django 内建标签 autoescape 控制当前自动转义的行为,有on和off两个选项 {% autoescape on %} {{ body }} {% endautoescape %} bl ...

  3. js读取xml文件

    假设我们现在要读取下面的 info.xml 文件 <?xml version="1.0" encoding="gb2312"?> <root& ...

  4. 【C++ Primer 第10章】 10.4.1 插入迭代器

    目录 •  iostream迭代器 •  反向迭代器 插入迭代器 插入迭代器,这些迭代器被绑定到一个容器上,可以向容器插入元素. 头文件为:#include<iterator it=t 在it指 ...

  5. mySQL 增量备份方案

    1.在 /etc/my.cnf 下面设置开启bin-log 编辑 vim /etc/my.cnf [mysqld] binlog_format       = MIXED                ...

  6. WebApi表头设置跨域

    public static class WebApiConfig { public static void Register(HttpConfiguration config) { var setti ...

  7. HTML5游戏 围住神经猫 开发

    所有文章搬运自我的个人主页:sheilasun.me 去年风靡微信朋友圈的小游戏"围住神经猫",我也试着做了一下,可以戳这里试玩→围住神经猫.游戏是用Egret引擎开发的,因为Eg ...

  8. POJ 1930 Dead Fraction (循环小数-GCD)

    题意:给你一个循环小数,化成分数,要求分数的分母最小. 思路:暴力搜一遍循环节 把循环小数化分数步骤: 纯循环小数化分数 纯循环小数的小数部分可以化成分数,这个分数的分子是一个循环节表示的数,分母各位 ...

  9. POJ 2395 Out of Hay (Kruskal)

    题意:从待选的路里面选出若干将所有点连通,求选出的边里最长边的最小值. 算法:要使得树的最长边最小,那么每次确定的边都应是待选边里最小的,即最小生成树.对应Kruskal算法. #include &l ...

  10. mysql 快速拷贝表