UVA 11613 Acme Corporation(不固定流量的最小费用流)
题意好长。。。。变量好多。。。。
增加源点跟汇点。然后将每个月份看成一个点,然后拆成两个点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(不固定流量的最小费用流)的更多相关文章
- Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负
/** 题目:Acme Corporation UVA - 11613 拆点法+最大费用最大流(费用取相反数)+费用有正负 链接:https://vjudge.net/problem/UVA-1161 ...
- UVA11613 Acme Corporation —— 最小费用流(流量不固定的最小费用流)
题目链接:https://vjudge.net/problem/UVA-11613 题意: 商品X在第i个月内:生产一件需要花费mi元,最多可生产ni件,销售一件(在这个月内销售,而不管它是在那个月生 ...
- Acme Corporation UVA - 11613 费用流
Code: #include<cstdio> #include<cstring> #include<vector> #include<queue> #i ...
- UVA 11248 - Frequency Hopping(网络流量)
UVA 11248 - Frequency Hopping 题目链接 题意:给定一个网络,如今须要从1到N运输流量C,问是否可能,假设可能输出可能,假设不可能,再问能否通过扩大一条边的容量使得可能,假 ...
- UVa11613 Acme Corporation(最小费用流)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33452 [思路] 最小费用流. 构图: 1 每个月建立2个点,建立 ...
- UVA-11613 Acme Corporation (最大费用最大流+拆点)
题目大意:有一种商品X,其每每单位存放一个月的代价I固定.并且已知其每月的最大生产量.生产每单位的的代价.最大销售量和销售单价,还已知每个月生产的X能最多能存放的时间(以月为单位).问只考虑前m个月, ...
- UVA 1659 Help Little Laura 帮助小劳拉 (最小费用流,最小循环流)
(同时也是HDU 2982,UVA的数据多) 题意:平面上有m条有向线段连接了n个点.你从某个点出发顺着有向线段行走,给走过的每条线段涂一种不同的颜色,最后回到起点.你可以多次行走,给多个回路涂色(要 ...
- UVa1658 Admiral(拆点法+最小费用流)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51253 [思路] 固定流量的最小费用流. 拆点,将u拆分成u1和u ...
- OC编程之道-创建对象之抽象工厂方法
定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. <AbstractProductA> <AbstractProductB> <Ab ...
随机推荐
- OCM_第四天课程:Section2 —》GC 的安装和配置
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- Twitter开源的Heron快速安装部署教程
什么是Heron? Twitter使用Storm实时分析海量数据已经有好几年了,并在2011年将其开源.该项目稍后开始在Apache基金会孵化,并在2015年秋天成为顶级项目.Storm以季度为发布周 ...
- LeetCode(7):颠倒整数
Easy! 题目描述:给定一个范围为 32 位 int 的整数,将其颠倒. 例1: 输入:132 输出:321 例2: 输入:-123 输出:-321 例3: 输入:120 输出:21 注意:假设我们 ...
- notepad++颜色修改
设置-->>语言格式设置-->> https://blog.csdn.net/onceing/article/details/51554399(别人博客园的内容) 另外下面是N ...
- sql如何截取字符
---MSSQL1 .SUBSTRING返回字符.binary.text 或 image 表达式的一部分.有关可与该函数一起使用的有效 Microsoft? SQL Server? 数据类型的更多信息 ...
- 【C语言】字节对齐(内存对齐)
数据对齐 1. 对齐原则: [原则1]数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma p ...
- 关于git中Pageant开机启动且自动关联秘钥
Pageant在git中主要负责和服务器端进行身份验证,但是我们每次在启动Pageant后都需要手动的加载秘钥文件,这其实是一个比较烦的过程,我们怎么能够使其自动的完成呢? 一.Pageant开机启动 ...
- Java 和 C++ 的部分区别
1. Java是解释型语言,所谓的解释型语言,就是源码会先经过一次编译,成为中间码,中间码再被解释器解释成机器码.对于Java而言,中间码就是字节码(.class),而解释器在JVM中内置了. 2. ...
- 转载 c++指针 指针入门
这是一篇我所见过的关于指针的最好的入门级文章,它可使初学者在很短的时间内掌握复杂的指针操作.虽然,现在的Java.C#等语言已经取消了指针,但作为一个C++程序员,指针的直接操作内存,在数据操作方面有 ...
- 微信小程序介绍
1.什么是微信小程序 是一种不需要下载即可使用的应用,实现了“触手可及的梦想”,用户扫一扫或者搜一下即可打开. 免安装 操作更接近原始的APP 必须在微信中使用 2.宣传方式 小程序搜索入口 附近的小 ...