洛谷P1251 餐巾计划问题(最小费用最大流)
题意
一家餐厅,第$i$天需要$r_i$块餐巾,每天获取餐巾有三种途径
1、以$p$的费用买
2、以$f$的费用送到快洗部,并在$m$天后取出
3、以$s$的费用送到慢洗部,并在$n$天后取出
问满足要求时的最小费用
Sol
一道非常不错的网络流,应该不难看出是费用流。
首先进行拆点,把每个点早上和晚上,然后进行连边
从$S$向i连边$(0, r_i)$,表示到了晚上有$r_i$块脏餐巾
从$i'$向$T$连边$(0, r_i)$,表示早上有$r_i$块新餐巾
从$S$向$i'$连边$(p, INF)$,表示每天早上可以以$p$的费用无限提供餐巾
从$i$向$i'$连边$(0, INF)$,表示每天晚上的脏餐巾可以留到第二天晚上
从$i$向$i' + m$连边$(f, INF)$,表示快洗
从$i$向$i' + n$连边$(s, INF)$,表示慢洗
这样既可以保证每天的$r_i$满足要求,又能保证最小费用。so nice
#include<cstdio>
#include<cstring>
#include<queue>
#define LL long long
using namespace std;
const int MAXN = 1e5 + , INF = 1e9 + ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, S, T;
int r[MAXN], p, m, f, n, s;
struct Edge {
int u, v, w, f, nxt;
}E[MAXN];
int head[MAXN], num;
inline void add_edge(int x, int y, int w, int f) {
E[num] = (Edge){x, y, w, f, head[x]};
head[x] = num++;
}
inline void AddEdge(int x, int y, int w, int f) {
add_edge(x, y, w, f);
add_edge(y, x, -w, );
}
int dis[MAXN], vis[MAXN], Pre[MAXN];
bool SPFA() {
memset(dis, 0x3f, sizeof(dis));
memset(vis, , sizeof(vis));
queue<int> q; dis[S] = ; q.push(S);
while(!q.empty()) {
int p = q.front(); q.pop(); vis[p] = ;
for(int i = head[p]; i != -; i = E[i].nxt) {
int to = E[i].v;
if(dis[to] > dis[p] + E[i].w && E[i].f) {
dis[to] = dis[p] + E[i].w;
Pre[to] = i;
if(!vis[to]) vis[to] = , q.push(to);
}
}
}
return dis[T] <= INF;
}
LL F() {
LL nowflow = INF;
for(int i = T; i != S; i = E[Pre[i]].u) nowflow = min(nowflow, (LL)E[Pre[i]].f);
for(int i = T; i != S; i = E[Pre[i]].u) E[Pre[i]].f -= nowflow, E[Pre[i] ^ ].f += nowflow;
return nowflow * dis[T];
}
LL MCMF() {
LL ans = ;
while(SPFA())
ans += F();
return ans;
}
int main() {
memset(head, -, sizeof(head));
N = read();
S = ; T = * N + ;
for(int i = ; i <= N; i++) r[i] = read();
p = read(); m = read(); f = read(); n = read(); s = read();
for(int i = ; i <= N; i++) AddEdge(S, i, , r[i]);
for(int i = ; i <= N; i++) AddEdge(S, i + N, p, INF);
for(int i = ; i <= N; i++) AddEdge(i + N, T, , r[i]);
for(int i = ; i <= N; i++) {
if(i + m <= N) AddEdge(i, i + N + m, f, INF);
if(i + n <= N) AddEdge(i, i + N + n, s, INF);
if(i + <= N) AddEdge(i, i + , , INF);
}
printf("%lld", MCMF());
}
洛谷P1251 餐巾计划问题(最小费用最大流)的更多相关文章
- 洛谷P1251 餐巾计划问题(费用流)
传送门 不得不说这题真是思路清奇,真是网络流的一道好题,完全没想到网络流的建图还可以这么建 我们把每一个点拆成两个点,分别表示白天和晚上,白天可以得到干净的餐巾(购买的,慢洗的,快洗的),晚上可以得到 ...
- 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】
(题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...
- 洛谷 P1251 餐巾计划问题
题目链接 最小费用最大流. 每天拆成两个点,早上和晚上: 晚上可以获得\(r_i\)条脏毛巾,从源点连一条容量为\(r_i\),费用为0的边. 早上要供应\(r_i\)条毛巾,连向汇点一条容量为\(r ...
- 洛谷P3381 - 【模板】最小费用最大流
原题链接 题意简述 模板题啦~ 题解 每次都以费用作为边权求一下最短路,然后沿着最短路增广. Code //[模板]最小费用最大流 #include <cstdio> #include & ...
- 洛谷 P2053 [SCOI2007]修车(最小费用最大流)
题解 最小费用最大流 n和m是反着的 首先, \[ ans = \sum{cost[i][j]}*k \] 其中,\(k\)为它在当前技术人员那里,排倒数第\(k\)个修 我们可以对于每个技术人员进行 ...
- 洛谷 P3381【模板】最小费用最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表 ...
- 洛谷 P3381 【模板】最小费用最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数\(N.M.S.T\) ...
- 洛谷P3381 【模板】最小费用最大流(dijstra费用流)
题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表 ...
- 洛谷 P1251 餐巾计划问题【最小费用最大流】
建图细节比较多,对于每个点i,拆成i和i',i表示用的餐巾,i'表示脏餐巾,连接: (s,i,r[i],p)表示在这一天买新餐巾 (i,t,r[i],0)表示这一天用了r[i]的餐巾 (s,i+n,r ...
随机推荐
- 浅谈js执行机制
关于js执行机制,老早之前就一直想写篇文章做个总结,因为和js执行顺序的面试题碰到的特别多,每次碰到总是会去网上查,没有系统地总结,搞得每次碰到都是似懂非懂的感觉,这篇文章就系统的总结一下js执行机制 ...
- POJ2976 Dropping tests —— 01分数规划 二分法
题目链接:http://poj.org/problem?id=2976 Dropping tests Time Limit: 1000MS Memory Limit: 65536K Total S ...
- java多线程实现简单队列
1.创建Queue.java public class Queue { private LinkedList<Object> list = new LinkedList<Object ...
- jQuery制作信息提示弹出层插件【推荐】
给大家分享一款非常实用的弹窗提示窗口插件,包含多种模式.带有回执函数值的功能.1. [代码][JavaScript]代码 <script type="text/javascript& ...
- Opencv中视频播放与进度控制
视频画面本质上是由一帧一帧的连续图像组成的,播放视频其实就是在播放窗口把一系列连续图像按一定的时间间隔一幅幅贴上去实现的. 人眼在连续图像的刷新最少达到每秒24帧的时候,就分辨不出来图像间的闪动了,使 ...
- ASP.NET WebServce项目下添加Http服务,支持Get,Post请求方式;传输格式json/xml
由于WEBServce老项目中需要增添新的接口,而且添加的接口不希望被其它项目以引用Servces方式使用. 那么得在现有Service项目中添加Http请求方式来实现系统间数据交互.只需要告知请求地 ...
- Spss22安装与破解教程
Spss22安装与破解教程 Spss22安装与破解教程 1.下载安装包 可以去IBM官网.人大论坛等网站下载,全部文件应包括spss22安装包(含32位及64位)和破解文件,这里提供一个64位的百度网 ...
- from表单POST提交nodejs
var form = new formidable.IncomingForm(); form.parse(req, function(err, fields, files) { console.log ...
- NOI前总结:点分治
点分治: 点分治的题目基本一样,都是路径计数. 其复杂度的保证是依靠 $O(n)$ 找重心的,每一次至少将问题规模减小为原先的$1/2$. 找重心我喜欢$BFS$防止爆栈. int Root(int ...
- cardboard sdk for unity 系统分析 - 属性行为分析CardBoard类
一.CardBoard类是个单例类,全局只有一个CardBoard对像且在需要时才生成: CardBoard中主要使用了BaseVRDevice device这个对像,而这个对像也是单例类BaseVR ...