Modular Production Line

\[Time Limit: 1000ms\quad Memory Limit: 65536kB
\]

题意

给出 \(N\) 种零件,现在你可以用连续的一些零件组装成为一个产品,组装完你可以获得 \(w\) 的价值,要求每种零件最多使用 \(K\) 次并且每一个产品只能生产一个。问你最多可以获得的价值是多少。

思路

由于给出的 \(N\) 很大, \(M\)很小,那么显然,很多点都是没有用的,那么我们就可以将他们舍弃掉,只使用出现的点,那么可以考虑到离散化。

  • 对于给出的每一个区间 \(\left[u, v\right]\) 内的零件,我们可以从 \(u\) 到 \(v+1\) 建一条流量为\(1\),费用为 \(-w\) 的边,表示制作了这一个产品的情况。
  • 对于全部的点,我们可以建一条从 \(i\) 到 \(i+1\) 的边,表示第 \(i\) 个零件不使用的情况。
  • 对于超级源点和超级汇点,我们建一条从超级源点到第一个点,流量为 \(K\),费用为 \(0\) 的边,在建一条从最后一个点到超级汇点,流量为 \(K\),费用为 \(0\) 的边,这是为了防止任意一种零件使用次数超过 \(K\),所以从一开始就限制了流量。

最后跑最小费用最大流,算出的答案的绝对值就是要求的。

#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pii pair<int, int>
#define INOPEN freopen("in.txt", "r", stdin)
#define OUTOPEN freopen("out.txt", "w", stdout) typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 5e2 + 10;
const int maxm = 1e4 + 10;
const ll mod = 1e9 + 7;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std; int n, m, k;
int cas, tol, T; struct Node{
int u, v;
int w, val;
int next;
} node[maxm];
int head[maxn];
int pre[maxn], dis[maxn], cap[maxn], vis[maxn]; void addnode(int u, int v, int w, int val) {
node[tol].u = u;
node[tol].v = v;
node[tol].w = w;
node[tol].val = val;
node[tol].next = head[u];
head[u] = tol++;
} bool spfa(int src, int des, int &flow, int &cost) {
mes(pre, 0), mes(dis, inf), mes(cap, 0), mes(vis, false);
queue<int> q;
while(!q.empty()) q.pop();
pre[src] = src;
vis[src] = true;
cap[src] = inf;
dis[src] = 0;
q.push(src);
while(!q.empty()) {
int u = q.front();
q.pop();
vis[u] = false;
for(int i=head[u]; ~i; i=node[i].next) {
int v = node[i].v;
if(node[i].w && dis[v] > dis[u]+node[i].val) {
dis[v] = dis[u]+node[i].val;
cap[v] = min(cap[u], node[i].w);
pre[v] = i;
if(!vis[v]) {
vis[v] = true;
q.push(v);
}
}
}
}
if(dis[des] == inf) return false;
flow += cap[des];
cost += cap[des] * dis[des];
int u = des;
while(u != src) {
node[pre[u]].w -= cap[des];
node[pre[u]^1].w += cap[des];
u = node[pre[u]].u;
}
return true;
} int MCMF(int src, int des) {
int flow = 0, cost = 0;
while(spfa(src, des, flow, cost));
return cost;
} vector<int> vv;
vector<pair <pair<int, int>, int> > vec; int getid(int x) {
return lower_bound(vv.begin(), vv.end(), x) - vv.begin() + 1;
} void init() {
tol = 0;
vv.clear();
vec.clear();
mes(head, -1);
} int main() {
scanf("%d" ,&T);
while(T--) {
init();
scanf("%d%d%d", &n, &k, &m);
for(int i=1, u, v, w; i<=m; i++) {
scanf("%d%d%d", &u, &v, &w);
vec.push_back(make_pair(make_pair(u, v), w));
vv.push_back(u);
vv.push_back(v);
}
sort(vv.begin(), vv.end());
vv.erase(unique(vv.begin(), vv.end()), vv.end());
int src = 0, des = vv.size() + 2;
for(int i=1; i<=vv.size(); i++) {
addnode(i, i+1, inf, 0);
addnode(i+1, i, 0, 0);
// printf("%d %d %d %d\n", i, i+1, inf, 0);
}
addnode(src, 1, k, 0);
addnode(1, src, 0, 0);
// printf("%d %d %d %d\n", src, 1, k, 0);
addnode(vv.size()+1, vv.size()+2, k, 0);
addnode(vv.size()+2, vv.size()+1, 0, 0);
// printf("%d %d %d %d\n", vv.size()+1, vv.size()+2, k, 0);
for(auto i : vec) {
int u = i.fi.fi, v = i.fi.se, w = i.se;
u = getid(u);
v = getid(v);
addnode(u, v+1, 1, -w);
addnode(v+1, u, 0, w);
// printf("%d %d %d %d\n", u, v+1, 1, -w);
}
int ans = -MCMF(src, des);
printf("%d\n", ans);
}
return 0;
}

Modular Production Line (MCMF)的更多相关文章

  1. Modular Production Line

     Modular Production Line 时空限制: 1000ms /65536K   An automobile factory has a car production line. Now ...

  2. 【网络流】Modular Production Line

    [网络流]Modular Production Line 焦作上的一道,网络流24题中的原题.... https://nanti.jisuanke.com/t/31715 给出了1e5个点,但是因为最 ...

  3. codeforces 319B Psychos in a Line(模拟)

    There are n psychos standing in a line. Each psycho is assigned a unique integer from 1 to n. At eac ...

  4. Intervals POJ - 3680 (MCMF)

    给你一些区间,每个区间都有些价值.取一个区间就能获得对应的价值,并且一个点不能覆盖超过k次,问你最大的价值是多少. 我们可以把这些区间放到一维的轴上去,然后我们可以把它看成一个需要从左到右的过程,然后 ...

  5. POJ 3617 Best Cow Line (模拟)

    题目链接 Description FJ is about to take his N (1 ≤ N ≤ 2,000) cows to the annual"Farmer of the Yea ...

  6. P3381 【模板】最小费用最大流(MCMF)

    P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入格式 第一行包含四个正整数N ...

  7. Azure Command Line (一)入门

    一,引言 今天我们讲解一个新的 Azure 的知识,叫 “Azure Command Line”,简称 Azure CLI,具体概念是什么,我这里也不多说了,总结下来,Azure CLI 其实就是 用 ...

  8. 2019牛客多校训练第三场H.Magic Line(思维)

    题目传送门 大致题意: 输入测试用例个数T,输入点的个数n(n为偶数),再分别输入n个不同的点的坐标,要求输出四个整数x1,y1,x2,y2,表示有一条经过点(x1,y1),(x2,y2)的直线将该二 ...

  9. Codeforces 1159F Winding polygonal line(叉积)

    其实这个几何写起来还是比较方便,只用到了叉积.首先我们贪心的考虑一种情况,对于任意给定的LR串,我们起点的选择肯定是在这些点围成的凸包端点上,对于这样的起点来说,他对于L或者R都是有选择的机会,而且一 ...

随机推荐

  1. HDFS 其他命令---fsck

    HDFS 其他命令 HDFS支持fsck命令用以检查各种不一致.fsck用以报告各种文件问题,如 block丢失或缺少block等.fack 命令用法如下: hdfs fsck <path> ...

  2. PowerBI开发 第四篇:DAX 表达式基础

    DAX 表达式主要用于创建度量列(Measure),度量值是根据用户选择的Filter和公式,计算聚合值,DAX表达式基本上都是引用对应的函数,函数的执行有表级(Table-Level)上下文和行级( ...

  3. java中什么是包

    一.什么是包 包允许将类组合成较小的单元(类似文件夹),使其易于找到和使用相应的类文件 包有助于避免命名冲突.在使用许多类时,类和方法的名称很难决定.有时需要使用与其他类相同的名称.包基本上隐藏了类并 ...

  4. Linux学习笔记之vim操作指令大全

    0x00 关于Vim Vim是款强大的文本编辑器,但是众多指令需要学习,这次记录了指令大全方便以后翻阅. Vim的几种模式 正常模式:可以使用快捷键命令,或按:输入命令行. 插入模式:可以输入文本,在 ...

  5. Django中一些常用的文档段落

    1. Settings¶ STATIC_URL¶ MEDIA_ROOT¶ MEDIA_URL¶ AUTH_USER_MODEL¶ USE_I18N¶ USE_L10N¶ USE_TZ¶    (三者默 ...

  6. JQuery EasyUI Tree组件的Bug记录

    记录一下使用项目中使用EasyUI遇到的bug,废话少说直接上菜  - _-(bug)..... bug ::   .netcore创建一个web应用时候,会自动引入jQuery库以及一些插件,但是在 ...

  7. c#异步方法调用

    var t1 = new Task(() => GkeyTest()); DisplaylistboxMSG("初始化:" + t1.Status.ToString()); ...

  8. [其它]iOS 13 正式版发布 iPhone 6s或更新型号均可升级

    苹果今天(2019.09.20)发布了 iOS 13 正式版,可以升级的设备包括 iPhone 6s 或更新型号.第七代 iPod Touch. iOS 13 推出深色模式,为 iPhone 带来截然 ...

  9. 多态性   类(class)的四则运算

       我们知道c语言中可以整型数据或浮点型等做四则运算,而自己写的类也可做四则运算,是不是感觉奇怪,可以看以下代码是如何完成类之间的四则运算: #include "stdafx.h" ...

  10. Python中的单例设计

    01. 单例设计模式 设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案 使用 设计模式 是为了可重用代码.让代码更容易被他人理解.保 ...