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个区间覆盖的前提下,重量最大 思路:感觉是很好想的费用流,把每个区间首尾相连,费用为该区间的重量的相反数(由 ...
随机推荐
- Linux服务器查看PHP是否支持mail()函数方法
PHP的Mail函数可以用来发送邮件,如查看Linux服务器PHP是否支持Mail函数? PHP查看是否支持Mail函数的方法 Linux系统下的服务器,查看PHP是否支持Mail函数的方法有很多种: ...
- TCP三次挥手
tcp:三次握手 client和server之间需要经历三次握手才能建立连接(connnect()方法中封装了三次握手的步骤)syn:同步请求,建立连接的请求ack:对syn请求包的确认 应答syn: ...
- thinkphp rpc
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在 ...
- 【LeetCode 9】回文数
题目链接 [题解] 还是要注意,取反的时候,-2^31 取反的话会爆掉Int..(因为int的正数最多到2^31-1) [代码] class Solution { public: bool isPal ...
- MySql中创建用户,授权
第一天搞MySql好多东西都不会,幸好有网络的强大资源,首先需要注意的是任何一条sql语句都是要以分号结尾的,不然很是蛋疼的 1.新建用户. //登录MYSQL @>mysql -u root ...
- Github上发布托管和下载
打包托管 远程下载安装 git clone https://github/2008nmj/mnist_python 使用git工具和命令行 Git使用场景 (可以不用上传到托管平台) 写论文 分工合作 ...
- Springboot开篇
1.Spring -boot-starter-web:用于构建web 应用模块,加入后包含spring mvc框架,默认内嵌tomcat容器 2.spring-boot-starter-jpa:用于构 ...
- 关于cefsharp 获取js动态加载后的信息
IFrame frame = null; var identifiers = Browser.GetBrowser().GetFrameIdentifiers(); foreach (var i in ...
- mkdir无法创建目录权限不够
https://idc.wanyunshuju.com/cym/40.html 由于在公司服务器上权限问题比较复杂,我们解决这个问题是寻求服务器端人员的意见.让他们授予权限/.
- 剑指offer——54数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...