【ybt金牌导航3-4-1】【luogu P2517】订货问题 / 订货

订货问题 / 订货

题目链接:ybt金牌导航3-4-1 / luogu P2517

题目大意

有一个物品,你每个月各要交付它给出的一定数量,然后买入也有不同的价格。
然后你有个仓库可以放一定数量的物品,然后放一个月的时间要给一个固定的费用。
问你最小花费。

思路

首先看到最小花费,我们考虑用最小花费最大流来做。

那最大流怎么定义流是什么呢?那你一定要交付的数量是固定的,那流量就是你交付东西的件数。
然后你想一下就把图构造出来:
在这里插入图片描述
然后跑最小费用最大流就可以了。

代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long

using namespace std;

struct node {
	int x, to, nxt, op, pri;
}e[1000001];
int n, m, S, dis[1001], run[1001], pre[1001];
int le[1001], KK, s, t, d[1001], u[1001];
bool in[1001], yes;
ll ans;

int lef(int x) {
	return x;
}

int rig(int x) {
	return n + x;
}

void add(int x, int y, int z, int pri) {
	e[++KK] = (node){z, y, le[x], KK + 1, pri}; le[x] = KK;
	e[++KK] = (node){0, x, le[y], KK - 1, -pri}; le[y] = KK;
}

bool spfa() {//最小费用最大流的操作
	yes = 0;
	memset(in, 0, sizeof(in));
	in[s] = 1;
	memset(dis, 0x7f, sizeof(dis));
	dis[s] = 0;
	queue <int> q;
	q.push(s);
	run[s] = 2147483647;
	
	while (!q.empty()) {
		int now = q.front();
		q.pop();
		
		if (now == t) {
			yes = 1;
		}
		
		for (int i = le[now]; i; i = e[i].nxt)
			if (dis[e[i].to] > dis[now] + e[i].pri && e[i].x) {
				dis[e[i].to] = dis[now] + e[i].pri;
				run[e[i].to] = min(run[now], e[i].x);
				pre[e[i].to] = i;
				if (!in[e[i].to]) {
					in[e[i].to] = 1;
					q.push(e[i].to);
				}
			}
		
		in[now] = 0;
	}
	
	return yes;
}

void add_() {
	int now = t;
	while (now != s) {
		e[pre[now]].x -= run[t];
		e[e[pre[now]].op].x += run[t];
		now = e[e[pre[now]].op].to;
	}
	
	ans += 1ll * run[t] * dis[t];
}

void dinic() {
	while (spfa())
		add_();
}

int main() {
	scanf("%d %d %d", &n, &m, &S);
	for (int i = 1; i <= n; i++) scanf("%d", &u[i]);
	for (int i = 1; i <= n; i++) scanf("%d", &d[i]);
	
	s = 0;
	t = 1000;
	
	for (int i = 1; i <= n; i++) {//建图
		add(s, lef(i), 2147483647, d[i]);
		if (i > 1) add(lef(i - 1), lef(i), S, m);
		add(lef(i), rig(i), u[i], 0);
		add(rig(i), t, 2147483647, 0);
	}
	
	dinic();
	
	printf("%lld", ans);
	
	return 0;
}
posted @ 2021-02-22 15:39  あおいSakura  阅读(54)  评论(0编辑  收藏  举报