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 ...
随机推荐
- POJ Washing Clothes 洗衣服 (01背包,微变型)
题意:有多种颜色的衣服,由两个人合作来洗,必须洗完一种颜色才能洗下一种,求需要多少时间能洗完. 思路:将衣服按颜色分类,对每种颜色进行01背包,容量上限是该种颜色衣服全部洗完的耗时长一半,其实就是在最 ...
- 使用python查询天气
python主代码 weather.py import urllib2 import json from city import city cityname = raw_input('你想查哪个城市的 ...
- Lesson2
#ifdef __cplusplus #include <cstdlib> #else #include <stdlib.h> #endif #include <SDL/ ...
- 机器学习之 PCA
PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...
- Resize a UIImage the right way
When deadlines loom, even skilled and experienced programmers can get a little sloppy. The pressure ...
- python_113_socket编程
Socket语法及相关 socket概念 socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递. 我们知道网络 通信 都 是基于 ip+port 方能 ...
- BCB:内存泄漏检查工具CodeGuard
一.为什么写这篇东西 自己在使用BCB5写一些程序时需要检查很多东西,例如内存泄漏.资源是否有释放等等,在使用了很多工具后,发觉BCB5本身自带的工具―CodeGuard,非常不错,使用也挺方便的,但 ...
- Bootstrap 网页乱码
问题:今天早上在实践bootstrap的时候,用EditPlus写代码,标签中包含了中文.在浏览器解析的时候中文部分生成的乱码.但是网页部分已经声明了使用utf-8的编码方式. 解决:网页字体正常显示 ...
- shell脚本,如何用shell打印金字塔
- iBeacon技术
声明:部分资料来源自互联网 前言 iBeacon 最早推出是在今年的苹果 WWDC 大会上.作为 iOS 7 的一部分,它吸引人的一点是,iBeacon 是一种开发标准——绝大多数智能手机支持蓝牙 4 ...