Modular Production Line
Modular Production Line
时空限制: 1000ms /65536K
An automobile factory has a car production line. Now the market is oversupply and the production line is often shut down. To make full use of resources, the manager divides the entire production line into N parts(1...N). Some continuous parts can produce sub-products. And each of sub-products has their own value. The manager will use spare time to produce sub-products to make money. Because of the limited spare time, each part of the production line could only work at most K times. And Because of the limited materials, each of the sub-products could be produced only once. The manager wants to know the maximum value could he make by produce sub-products.
Input
The first line of input is T, the number of test case.
The first line of each test case contains three integers,N,K and M. (M is the number of different sub-product).
The next MM lines each contain three integers Ai,Bi,Wi describing a sub-product. The sub-product has value Wi. Only Ai to Bi parts work simultaneously will the sub-product be produced (include Ai to Bi).
1≤T≤100
1≤K≤M≤200
1≤N≤10^5
1≤Ai≤Bi≤N
1≤Wi≤10^5
Output
For each test case output the maximum value in a separate line.
样例输入
4
10 1 3
1 2 2
2 3 4
3 4 8
10 1 3
1 3 2
2 3 4
3 4 8
100000 1 3
1 100000 100000
1 2 3
100 200 300
100000 2 3
1 100000 100000
1 150 301
100 200 300
样例输出
10
8
100000
100301
题目来源
ACM-ICPC 2018 焦作赛区网络预赛
最大权不相交路径问题.与最长K可重区间问题几乎是一样的。
有一点不同的是在最长K可重区间问题中每个区间端点是不算在区间交集里的,而在这个问题中区间端点是算在区间交集里的。把每个区间右端点加一,就可以转化为最长K可重区间问题了。
还有一点要注意的是,在最长K可重区间问题中,参考博客给了两种解法,而这里的数据量比较大,因此只能用第二种的离散化方法来写。
#include<bits/stdc++.h>
#define INF INT_MAX/2
#define N 800
using namespace std; typedef struct
{
int u,v,next;
int flow,cost;
}ss; ss edg[*N];
int head[N];
int now_edge=; void addedge(int u,int v,int flow,int cost)
{
edg[now_edge]=(ss){u,v,head[u],flow,cost};
head[u]=now_edge++;
edg[now_edge]=(ss){v,u,head[v],,-cost};
head[v]=now_edge++;
} bool spfa(int s,int t,int &flow,int &cost)
{
int dis[N];
for(int i=;i<N;i++)dis[i]=INF;
dis[s]=; int vis[N]={};
vis[s]=; queue<int>q;
q.push(s); int addflow[N]={};
addflow[s]=INF; int pre[N]={}; while(!q.empty())
{
int now=q.front();
q.pop();
vis[now]=; for(int i=head[now];i!=-;i=edg[i].next)
{
ss e=edg[i]; if(e.flow>&&dis[e.v]>dis[now]+e.cost)
{
dis[e.v]=dis[now]+e.cost;
addflow[e.v]=min(addflow[now],e.flow);
pre[e.v]=i; if(!vis[e.v])
{
q.push(e.v);
vis[e.v]=;
}
}
}
} if(dis[t]==INF)return false; flow+=addflow[t];
cost+=addflow[t]*dis[t]; int now=t;
while(now!=s)
{
edg[pre[now]].flow-=addflow[t];
edg[pre[now]^].flow+=addflow[t];
now=edg[pre[now]].u;
} return true;
} void MCMF(int s,int t,int &flow,int &cost)
{
while(spfa(s,t,flow,cost));
} struct
{
int l,r,value;
}arr[N]; int lsh[N],len_lsh;
int f(int x)
{
return lower_bound(lsh,lsh+len_lsh,x)-lsh+;
} void init()
{
for(int i=;i<N;i++)head[i]=-;
now_edge=;
len_lsh=;
} int main()
{
int t=;
scanf("%d",&t);
while(t--)
{
init();
int n,k,m;
scanf("%d %d %d",&n,&k,&m); for(int i=;i<m;i++)
{
scanf("%d %d %d",&arr[i].l,&arr[i].r,&arr[i].value);
arr[i].r++;
lsh[len_lsh++]=arr[i].l;
lsh[len_lsh++]=arr[i].r;
} sort(lsh,lsh+len_lsh);
len_lsh=unique(lsh,lsh+len_lsh)-lsh; int s=len_lsh+,t=s+;
addedge(s,,k,);
addedge(len_lsh,t,INF,);
for(int i=;i<len_lsh;i++)addedge(i,i+,INF,); for(int i=;i<m;i++)addedge(f(arr[i].l),f(arr[i].r),,-arr[i].value); int cost=,flow=;
MCMF(s,t,flow,cost);
printf("%d\n",-cost);
}
return ;
}
Modular Production Line的更多相关文章
- Modular Production Line (MCMF)
Modular Production Line \[ Time Limit: 1000ms\quad Memory Limit: 65536kB \] 题意 给出 \(N\) 种零件,现在你可以用连续 ...
- 【网络流】Modular Production Line
[网络流]Modular Production Line 焦作上的一道,网络流24题中的原题.... https://nanti.jisuanke.com/t/31715 给出了1e5个点,但是因为最 ...
- ACM-ICPC 2018 焦作赛区网络预赛 F. Modular Production Line (区间K覆盖-最小费用流)
很明显的区间K覆盖模型,用费用流求解.只是这题N可达1e5,需要将点离散化. 建模方式步骤: 1.对权值为w的区间[u,v],加边id(u)->id(v+1),容量为1,费用为-w; 2.对所有 ...
- 焦作F Modular Production Line 费用流
题目链接 题解:这道题比赛的时候,学弟说是网络流,当时看N这么大,觉得网络流没法做,实际本题通过巧妙的建图,然后离散化. 先说下建图方式,首先每个覆盖区域,只有左右端点,如果我们只用左右端点的话,最多 ...
- 2018 ACM 网络选拔赛 焦作赛区
A. Magic Mirror #include <cstdio> #include <cstdlib> #include <cmath> #include < ...
- ACM-ICPC 2018 焦作赛区网络预赛 Solution
A. Magic Mirror 水. #include <bits/stdc++.h> using namespace std; int t; ]; inline bool work() ...
- ACM-ICPC 2018 焦作赛区网络预赛
这场打得还是比较爽的,但是队友差一点就再过一题,还是难受啊. 每天都有新的难过 A. Magic Mirror Jessie has a magic mirror. Every morning she ...
- ACM-ICPC 2018 焦作网络赛
题目顺序:A F G H I K L 做题链接 A. Magic Mirror 题意:判断 给出的 字符串 是否等于"jessie",需要判断大小写 题解:1.用stl库 tolo ...
- 计算机视觉code与软件
Research Code A rational methodology for lossy compression - REWIC is a software-based implementatio ...
随机推荐
- URAL 2047 Maths (数学)
对于一个数来说,它的除数是确定的,那么它的前驱也是确定的,而起点只能是1或2,所以只要类似筛法先预处理出每个数的除数个数 ,然后递推出每个数往前的延伸的链长,更新最大长度,记录对应数字.找到maxn以 ...
- Bellman-Ford与SPFA
一.Bellman-Ford Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(当然也可以是无向图).与Dijkstra相比的优点是,也适合存在负权的图. 若存在最短路(不含负环时 ...
- ftpaccess - ftpd的配置档
描述 DESCRIPTION 这个ftpaccess档案是用来配置下述功能的运作 存取功能(AccessCapabilities) autogroup<群组名称><类别>[&l ...
- NASM 之 helloworld1
SECTION .data msg: db "Hello World!", 0x0a len: equ $-msg SECTION .text global _main kerne ...
- python基础一 day11 装饰器复习
# 复习# 讲作业# 装饰器的进阶 # functools.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数# 周末的作业 # 文件操作 # 字符串处理 # 输入输出 # 流程控制 # 装 ...
- s:iterator的多层迭代
struts2的s:iterator 可以遍历 数据栈里面的任何数组,集合等等 以下几个简单的demo:s:iterator 标签有3个属性: value:被迭代的集合 id :指定集 ...
- MongoDB在java中的使用
在一年前就开始在项目中使用Mongodb作为爬虫(crawler)待下载URL.下载成功URL等的存储库,最近对项目进行版本更新,根据Mongodb的最近升级情况,也对项目中的Mongodb进行了相关 ...
- linux系统产生随机数的6种方法
linux系统产生随机数的6种方法 方法一:通过系统环境变量($RANDOM)实现: [root@test ~]# echo $RANDOM 11595 [root@test ~]# echo $RA ...
- vue-music:歌词的其他功能
由于歌词的播放需要歌曲播放,切换歌曲,歌曲的播放模式等等有关联,因此,需要在这几处处理相关问题 1.循环播放回不到开始位置 loop() { this.$refs.audio.currentTime ...
- DOM事件模型浅析
1.何为DOM DOM是"Document Object Model"的缩写,中文译为"文档对象模型".它是一种跨平台.跨语言的编程接口,将HTML,XHTML ...