Intervals POJ - 3680
给定数轴上n个带权区间$[l_i,r_i]$,权值为$w_i$
选出一些区间使权值和最大,且每个点被覆盖次数不超过k次。
离散+拆点,最大费用可行流(跑到费用为负为止)
第一部分点按下标串起来,相邻两个点之间连容量为k,费用为0的边
拆的两个点之间连容量为k,费用为0的双向边
第二部分点按区间连容量为1,费用为w的边。
第一部分流向第二部分表示开始覆盖,第二部分流向第一部分表示结束覆盖,同一时间内正在覆盖的容量不会超过k。
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define Formylove return 0
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int M=,N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,k,ls[N],l[N],r[N],w[N]; template<typename T>void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct edge {
int u,v,cap,fl,cost,nx;
edge(){}
edge(int u,int v,int cap,int fl,int cost,int nx):u(u),v(v),cap(cap),fl(fl),cost(cost),nx(nx){}
}e[M]; int ecnt=,fir[N];
void add(int u,int v,int cap,int cost) {
e[++ecnt]=edge(u,v,cap,,cost,fir[u]); fir[u]=ecnt;
//printf("%d->%d:%d\n",u,v,cap);
e[++ecnt]=edge(v,u,,,-cost,fir[v]); fir[v]=ecnt;
} queue<int>que;
int d[N],vis[N],p[N];
int spfa(int s,int t) {
For(i,,n) d[i]=-;
d[s]=; que.push(s);
while(!que.empty()) {
int x=que.front();
que.pop(); vis[x]=;
for(int i=fir[x];i;i=e[i].nx) if(e[i].cap>e[i].fl) {
int y=e[i].v;
if(d[y]<d[x]+e[i].cost) {
p[y]=i;
d[y]=d[x]+e[i].cost;
if(!vis[y]) {
vis[y]=;
que.push(y);
}
}
}
}
return d[t]>;
} #define inf 1e9
int calc(int s,int t) {
int fl=inf,cost=;
for(int i=t;i!=s;i=e[p[i]].u)
fl=min(fl,e[p[i]].cap-e[p[i]].fl);
for(int i=t;i!=s;i=e[p[i]].u) {
e[p[i]].fl+=fl,e[p[i]^].fl-=fl;
cost+=e[p[i]].cost;
}
return fl*cost;
} int EK(int s,int t) {
int rs=;
while(spfa(s,t)) {
rs+=calc(s,t);
}
return rs;
} void init() {
ecnt=;
memset(fir,,sizeof(fir));
} int main() {
#ifdef ANS
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
int T; read(T);
while(T--) {
init();
read(n); read(k);
ls[]=;
For(i,,n) {
read(l[i]); read(r[i]); read(w[i]);
ls[++ls[]]=l[i];
ls[++ls[]]=r[i];
}
sort(ls+,ls+ls[]+);
int sz=unique(ls+,ls+ls[]+)-(ls+);
int s=sz*+,t=s+;
add(s,,k,);
For(i,,sz-) add(i,i+,k,);
add(sz,t,k,);
For(i,,sz) add(i,sz+i,k,),add(sz+i,i,k,);
For(i,,n) {
int a=l[i],b=r[i];
a=lower_bound(ls+,ls+sz+,a)-ls;
b=lower_bound(ls+,ls+sz+,b)-ls;
add(sz+a,sz+b,,w[i]);
}
n=t;
int ans=EK(s,t);
printf("%d\n",ans);
}
Formylove;
}
/*
4 3 1
1 2 2
2 3 4
3 4 8 3 1
1 3 2
2 3 4
3 4 8 3 1
1 100000 100000
1 2 3
100 200 300 3 2
1 100000 100000
1 150 301
100 200 300
*/
Intervals POJ - 3680的更多相关文章
- Intervals POJ - 3680 (MCMF)
给你一些区间,每个区间都有些价值.取一个区间就能获得对应的价值,并且一个点不能覆盖超过k次,问你最大的价值是多少. 我们可以把这些区间放到一维的轴上去,然后我们可以把它看成一个需要从左到右的过程,然后 ...
- 2014湘潭全国邀请赛I题 Intervals /POJ 3680 / 在限制次数下取有权区间使权最大/小问题(费用流)
先说POJ3680:给n个有权(权<10w)开区间(n<200),(区间最多数到10w)保证数轴上所有数最多被覆盖k次的情况下要求总权最大,输出最大权. 思路: 限制的处理:s ...
- poj 3680 Intervals(费用流)
http://poj.org/problem?id=3680 巧妙的构图. 题目:给定N个区间(ai,bi)权值wi,求最大权和且每个点最多覆盖K次. 构图:将区间端点离散化,将第i个点连第i+1个点 ...
- POJ 3680 Intervals(费用流)
Intervals Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5762 Accepted: 2288 Descrip ...
- POJ 3680 Intervals(费用流+负权优化)
[题目链接] http://poj.org/problem?id=3680 [题目大意] 有N个带权重的区间,现在要从中选取一些区间, 要求任意点都不被超过K个区间所覆盖,请最大化总的区间权重. [题 ...
- POJ 3680:Intervals(最小费用最大流)***
http://poj.org/problem?id=3680 题意:给出n个区间[Li,Ri],每个区间有一个权值wi,要使得每个点都不被超过k个区间覆盖(最多能被k个区间覆盖),如果选取了第i个区间 ...
- 网络流(最大费用最大流) :POJ 3680 Intervals
Intervals Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7218 Accepted: 3011 Descrip ...
- poj 3680 Intervals
给定N个带权的开区间,第i个区间覆盖区间(ai,bi),权值为wi.现在要求挑出一些区间使得总权值最大,并且满足实轴上任意一个点被覆盖不超过K次. 1<=K<=N<=200.1< ...
- POJ 3680: Intervals【最小费用最大流】
题目大意:你有N个开区间,每个区间有个重量wi,你要选择一些区间,使得满足:每个点被不超过K个区间覆盖的前提下,重量最大 思路:感觉是很好想的费用流,把每个区间首尾相连,费用为该区间的重量的相反数(由 ...
随机推荐
- vue-cli 项目配置
vue viewport <meta name="viewport" content="width=device-width,initial-scale=1,min ...
- Java高并发网络编程(四)Netty
在网络应用开发的过程中,直接使用JDK提供的NIO的API,比较繁琐,而且想要进行性能提升,还需要结合多线程技术. 由于网络编程本身的复杂性,以及JDK API开发的使用难度较高,所以在开源社区中,涌 ...
- delphi下运行vbscript脚本
简单一个vb脚本,功能为打开被限制的注册表.Set wso = CreateObject("WScript.Shell")wso.RegWrite "HKEY_CURRE ...
- NX二次开发-自定义添加右键菜单RegisterConfigureContextMenuCallback
首先声明这个知识我以前不知道,是夏天的时候看到别人在唐工的QQ群里问的,唐工说西门子官方有这个例子.那个时候我因为在忙其他事情,也就没去研究那个右键菜单到底是怎么做的.关于自定义添加右键菜单Regis ...
- centos 下安装 shpinx2.1.7 记录
安装sphinx yum install -y mysql mysql-devel yum install automake autoconf cd /usr/local/src/ wget http ...
- js滚动到顶部底部代码
<!DOCTYPE HTML> <html> <head> <meta charset=UTF-8> <title>SCROLL</t ...
- 4. Python数据类型之数字、字符串、列表
开发过程中,我们需要处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定义不同的数据类型.在Python中,能够直接处理的数据类型主要有以下几种:数字.字符串.列表.元组.字典.集合等 ...
- 7、jmeter-定时器介绍与使用
jmeter-定时器介绍与使用 固定定时器 Uniform Random Timer Precise Throughput Timer Constant Throughput Timer 高斯随机定时 ...
- JS:面向对象(进阶篇)
组合使用构造函数和原型模式 构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性.结果,每个实例都会有自己的一份实例属性的副本,但同时又共享这对方法的引用,最大限度的节省了内存. funct ...
- [已解决]报错:报错AttributeError: 'int' object has no attribute 'upper'
原因:openpyxl版本低,需升级 pip install --upgrade openpyxl