「网络流24题」「LuoguP3358」 最长k可重区间集问题(费用流
题目描述

对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度。
输入输出格式
输入格式:
的第 1 行有 2 个正整数 n和 k,分别表示开区间的个数和开区间的可重迭数。接下来的 n行,每行有 2 个整数,表示开区间的左右端点坐标。
输出格式:
将计算出的最长 k可重区间集的长度输出
输入输出样例
说明
对于100%的数据,1<=n<=500,1<=k<=3
题解
建图:从$S$往$L$左端点连容量为k,费用为0;
从$L$上每个点$i$往点$i+1$连容量为INF,费用为0;
从$L$右端点往$T$连容量INF,费用为0。
>然后从每个区间的左端点往右端点连边,容量为1,费用为右端点$-$左端点(这道题区间长度的定义是右端点$-$左端点
然后跑最大费用最大流就行啦~
这样跑出来的费用会尽量大,而因为S处控制了流量,最大流就是k。
答案就是费用。
然后最大费用最大流就是把费用存负,跑最小费用最大流,输出答案的时候再取反就行了。
然后这道题长度没个范围,所以还要搞个离散。
/*
qwerta
P3358 最长k可重区间集问题
Accepted
100
代码 C++,2.16KB
提交时间 2018-10-09 18:19:08
耗时/内存
31ms, 936KB
*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
const int INF=2e9;
struct emm{
int e,f,v,c;
}a[];
int h[];
int tot=;
void con(int x,int y,int v,int c)
{
a[++tot].f=h[x];
h[x]=tot;
a[tot].e=y;
a[tot].v=v;
a[tot].c=c;
a[++tot].f=h[y];
h[y]=tot;
a[tot].e=x;
a[tot].c=-c;
return;
}
struct ahh{
int l,r;
}b[];
int ls[];
int s,t;
queue<int>q;
bool sf[];
int dis[];
inline bool spfa()
{
memset(sf,,sizeof(sf));
memset(dis,,sizeof(dis));
sf[s]=;dis[s]=;q.push(s);
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=h[x];i;i=a[i].f)
if(dis[a[i].e]>dis[x]+a[i].c&&a[i].v)
{
dis[a[i].e]=dis[x]+a[i].c;
if(!sf[a[i].e])
{
sf[a[i].e]=;
q.push(a[i].e);
}
}
sf[x]=;
}
return dis[t]<INF;
}
long long ans=;
int dfs(int x,int al)
{
sf[x]=;
if(x==t||!al)return al;
int fl=;
for(int i=h[x];i;i=a[i].f)
if(dis[a[i].e]==dis[x]+a[i].c&&a[i].v&&!sf[a[i].e])
{
int f=dfs(a[i].e,min(al,a[i].v));
if(f)
{
fl+=f;
al-=f;
ans+=f*a[i].c;
a[i].v-=f;
a[i^].v+=f;
if(!al)break;
}
}
if(!fl)dis[x]=-INF;
return fl;
}
int main()
{
//freopen("a.in","r",stdin);
int n,k;
scanf("%d%d",&n,&k);
int tol=;
for(int i=;i<=n;++i)
{
scanf("%d%d",&b[i].l,&b[i].r);
ls[++tol]=b[i].l;
ls[++tol]=b[i].r;
}
//离散
sort(ls+,ls+tol+);
int len=(unique(ls+,ls+tol+)-ls)-;//用unique去重
for(int i=;i<=n;++i)
{
int ll=lower_bound(ls+,ls+len+,b[i].l)-ls;
int rr=lower_bound(ls+,ls+len+,b[i].r)-ls;
con(ll,rr,,-(b[i].r-b[i].l));//建边
}
//
s=,t=len+;
for(int i=;i<len;++i)
con(i,i+,INF,);
con(s,,k,);
con(len,t,INF,);
//
while(spfa())
{
sf[t]=;
while(sf[t])
{
memset(sf,,sizeof(sf));
dfs(s,INF);
}
}
cout<<-ans;//输出再取个负就好了
return ;
}
「网络流24题」「LuoguP3358」 最长k可重区间集问题(费用流的更多相关文章
- 【网络流24题】No.21 (最长 k 可重区间集问题 最长不相交路径 最大费用流)
[] 输入文件示例input.txt4 21 76 87 109 13 输出文件示例output.txt15 [分析] 直接co题解好了,写得挺全.. [建模方法] 方法1 按左端点排序所有区间,把每 ...
- 【网络流24题】最长k可重区间集(费用流)
[网络流24题]最长k可重区间集(费用流) 题面 Cogs Loj 洛谷 题解 首先注意一下 这道题目里面 在Cogs上直接做就行了 洛谷和Loj上需要判断数据合法,如果\(l>r\)就要交换\ ...
- [网络流24题] 最长k可重区间集问题 (费用流)
洛谷传送门 LOJ传送门 很巧妙的建图啊...刚了$1h$也没想出来,最后看的题解 发现这道题并不类似于我们平时做的网络流题,它是在序列上的,且很难建出来二分图的形. 那就让它在序列上待着吧= = 对 ...
- 【网络流24题】最长k可重线段集(费用流)
[网络流24题]最长k可重线段集(费用流) 题面 Cogs的数据有问题 Loj 洛谷 题解 这道题和最长k可重区间集没有区别 只不过费用额外计算一下 但是,还是有一点要注意的地方 这里可以是一条垂直的 ...
- [网络流24题] 最长k可重线段集问题 (费用流)
洛谷传送门 LOJ传送门 最长k可重区间集问题的加强版 大体思路都一样的,不再赘述,但有一些细节需要注意 首先,坐标有负数,而且需要开$longlong$算距离 但下面才是重点: 我们把问题放到了二维 ...
- LibreOJ #6014. 「网络流 24 题」最长 k 可重区间集
#6014. 「网络流 24 题」最长 k 可重区间集 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 ...
- loj #6014. 「网络流 24 题」最长 k 可重区间集
#6014. 「网络流 24 题」最长 k 可重区间集 题目描述 给定实直线 L LL 上 n nn 个开区间组成的集合 I II,和一个正整数 k kk,试设计一个算法,从开区间集合 I II 中选 ...
- COGS743. [网络流24题] 最长k可重区间集
743. [网络流24题] 最长k可重区间集 ★★★ 输入文件:interv.in 输出文件:interv.out 简单对比时间限制:1 s 内存限制:128 MB «问题描述: «编 ...
- 【网络流24题】最长k可重区间集问题(费用流)
[网络流24题]最长k可重区间集问题 [问题分析] 最大权不相交路径问题,可以用最大费用最大流解决. [建模方法] 方法1 按左端点排序所有区间,把每个区间拆分看做两个顶点<i.a>< ...
- [网络流24题]最长k可重区间集[题解]
最长 \(k\) 可重区间集 题目大意 给定实心直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取开区间集 ...
随机推荐
- gulp安装+一个超简单入门小demo
gulp安装參考.gulp安装參考2. 一.NPM npm是node.js的包管理工具.主要功能是管理.更新.搜索.公布node的包. Gulp是通过npm安装的. 所以首先,须要安装node.js. ...
- ubuntu怎样打开命令行终端(5种方法)
内容中包含 base64string 图片造成字符过多,拒绝显示
- python+OpenCV进行人脸检测【转】
OpenCV的人脸检测功能在一般场合还是不错的.而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码. 写代码之前应该先安装python-opencv: $ su ...
- PS 抠图如何使用通道法处理头发
通道抠图法抠出美女飘逸头发-PS抠图实例教程 抠图更换背景后效果图 通道抠图法抠出美女飘逸头发-PS抠图实例教程 教程步骤: 1 打开原图,进入通道面板. 通道抠图法抠出美女飘逸头发-PS抠图实 ...
- 初涉IPC,了解AIDL的工作原理及用法
初涉IPC,了解AIDL的工作原理及用法 今天来讲讲AIDL.这个神奇的AIDL,也是近期在学习的,看了某课大神的解说写下的blog,希望结合自己的看法给各位同价通俗易懂的解说 官方文档:http:/ ...
- NoSQL数据库-MongoDB和Redis
http://blog.csdn.net/tea_wu/article/details/19050277 http://www.uml.org.cn/sjjm/201212205.asp
- matplotlib简易新手教程及动画
做数据分析,首先是要熟悉和理解数据.所以掌握一个趁手的可视化工具是很重要的,否则对数据连个主要的感性认识都没有,怎样进行下一步的design 点击打开链接 还有一个非常棒的资料 Matplotlib ...
- python(40)- 进程、线程、协程及IO模型
一.操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式:向下管理硬件,向上提供接口. 操作系统进行进程切换:1.出现IO操作:2.固定时间. 固定时间很短,人感受不到.每一个应用层运行起 ...
- iOS 插件制作
概述 我们平时也使用了非常多的xcode插件,尽管官方对于插件制作没有提供不论什么支持,可是载入三方的插件,默认还是被同意的.第三方的插件,须要存放在 ~/Library/Application Su ...
- 1.excel如何让一列的数都乘以固定值
让B列等于A列乘以39.37 1.我们先选中B列中要编辑的单元: 2.再在编辑栏中输入公式:=A2*39.37 (PS:*号即表示是×号) 3.公式输入后,按下快捷键:CTRL+回车:记住一定要 ...