对于区间 u->v ,连接边 u->v,权值为-len,容量为1,之后对每个点 i->i+1,连边 i->i+1,容量为k,权值为0,求区间最左端点到最右端点的费用流,费用相反数即为答案。

// q.c#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
const int M=500+5,INF=(int)1e8;
struct Edge {int u,v,nex,cost,flow,cap; Edge() {}Edge(int a,int b,int c,int d,int e,int f):u(a),v(b),nex(c),cost(d),flow(e),cap(f) {}
}ed[M<<3];
int cnt,head[M<<1];
void add_edge(int a,int b,int c,int d) {ed[cnt]=Edge(a,b,head[a], c,0,d); head[a]=cnt++;ed[cnt]=Edge(b,a,head[b],-c,0,0); head[b]=cnt++;
}
struct Dinic {int n,s,t,dis[M<<1],pre[M<<1],lim[M<<1]; bool in[M<<1]; queue<int> Q;Dinic():n(0),s(0),t(0) {mem(dis); mem(pre); mem(lim); mem(in);while(!Q.empty()) Q.pop();}bool spfa(int &Flow,int &Cost) {for(int i=0;i<=n;i++) dis[i]=lim[i]=INF,pre[i]=in[i]=0;dis[s]=0; in[s]=true; Q.push(s);int u,i; Edge e;while(!Q.empty()) {u=Q.front(); Q.pop(); in[u]=false;for(i=head[u];i!=-1;i=ed[i].nex) {e=ed[i];if(dis[u]+e.cost<dis[e.v]&&e.cap>e.flow) {dis[e.v]=dis[u]+e.cost; pre[e.v]=i;lim[e.v]=min(lim[u],e.cap-e.flow);if(!in[e.v]) in[e.v]=true,Q.push(e.v);}}}if(dis[t]==INF) return false;Flow+=lim[t];Cost+=lim[t]*dis[t];u=t;while(u!=s) {i=pre[u]; ed[i].flow+=lim[t];ed[i^1].flow-=lim[t]; u=ed[i].u;}return true;}int solve(int x,int y,int z) {s=x; t=y; n=z;int Flow=0,Cost=0;for(;spfa(Flow,Cost););return Cost;}
}DC;
struct Data {int x,y,z;bool operator < (const Data &A) const {if(x!=A.x) return x<A.x;return y<A.y;}
}da[M],tmp[M<<1];
int ref[M<<1];
int main() {freopen("interv.in","r",stdin);freopen("interv.out","w",stdout);memset(head,-1,sizeof(head));int n,k,m=0,a,b,p,q,tot=0;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++) {scanf("%d%d",&a,&b);if(a>=b) continue;++m;q=m<<1; p=q-1;da[m].x=p,da[m].y=q;da[m].z=b-a;tmp[p].x=a,tmp[p].y=p;tmp[q].x=b,tmp[q].y=q;}sort(tmp+1,tmp+(m<<1)+1);for(int i=1;i<=(m<<1);i++) {if(tmp[i].x!=tmp[i-1].x) ref[tmp[i].y]=++tot;else ref[tmp[i].y]=tot;}for(int i=1;i<=m;i++) {da[i].x=ref[da[i].x];da[i].y=ref[da[i].y];add_edge(da[i].x,da[i].y,-(da[i].z),1);}for(int i=1;i<tot;i++) {add_edge(i,i+1,0,INF);}add_edge(0,1,0,k);add_edge(tot,tot+1,0,k);printf("%d\n",-DC.solve(0,tot+1,tot+1));return 0;
}

转载于:https://www.cnblogs.com/qjs12/p/8902727.html

[网络流24题] 最长k可重区间集相关推荐

  1. 【刷题】LOJ 6014 「网络流 24 题」最长 k 可重区间集

    题目描述 给定实直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取出开区间集合 \(S \subseteq ...

  2. P3358 最长k可重区间集问题(网络流:串联思想)

    P3358 最长k可重区间集问题 这是一个经典模型,给定n个开区间,选择一些区间使得每个位置被覆盖次数不超过k,并最大化选择的区间长度之和. 首先一个直接的想法就是每一个区间匹配了它所对应的点,但是我 ...

  3. 网络流二十四题 ————(二十一)、P3358 最长k可重区间集问题 费用流并联与串联选择

    https://www.luogu.com.cn/problem/solution/P3358 洛谷大佬们题解写的很棒,我就不献丑了. 说下我的理解吧,可以把这个限制过程当初物理中的电路并联与串联.流 ...

  4. 网络流24题之最长k可重区间集问题

    对于每个点向后一个点连流量为k费用为0的边 对每一区间连l到r流量为1费用为r-l的边 然后最小费用最大流,输出取反 一开始写的r-l+1错了半天... By:大奕哥 1 #include<bi ...

  5. 洛谷 - P3358 最长k可重区间集问题(最大费用最大流+思维建边)

    题目链接:点击查看 题目大意:给出n个开区间,现在要求从中选取一定数量的区间,需要满足: 对于任意点x,所选取的区间中包含点x的个数小于等于k 区间长度和最大 要求输出最长的区间长度和 题目分析:一开 ...

  6. 最长k可重区间集问题最长k可重线段集问题

    题解: 洛谷上这两题的题意都是有问题的 按照标程题意不应该是开区间而是左开右闭区间 然后连边比较巧妙 我们可以看成选k条不相交的路径,其中i-i+1中有k条边 所以建图i-i+1流量为k,权值为0 l ...

  7. P3357 最长k可重线段集问题 网络流

    P3357 最长k可重线段集问题 题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\sub ...

  8. 洛谷P3357:最长k可重线段集问题(网络流)

    解析 本题的建模方法有很多,我的做法是补集思想转化成志愿者招募然后按照那道题的做法直接做,看题解更多是采用的对于不冲突的线段首尾加边的做法. 在前一道最长k可重区间问题中这两种做法谈不上孰优孰劣,但本 ...

  9. [网络流24题] 最长递增子序列

    [网络流24题] 最长递增子序列 «问题描述: 给定正整数序列x1,..., xn. (1)计算其最长递增子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的递增子序列. (3)如果允 ...

最新文章

  1. 为什么说重启能解决90%的问题
  2. 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )
  3. php 安全设置总结。
  4. mysql在计算机管理中的路径怎么修改_Rstudio中修改工作路径的三种方法
  5. 共享服务器硬件要求,共享服务器的配置与管理.doc
  6. java 正方形_java-确定正方形和矩形之间的关系的算法
  7. BZOJ3653: 谈笑风生
  8. 一起学Windows phone7开发(五.一个时钟的例子)
  9. Windows下编译CMake源码(Opencv源码编译)
  10. 无线组网-AC联动radius服务器实现portal认证
  11. 仿二手商城模板html,仿转转商城APP页面模板
  12. 在Android的Termux超级终端下进行内网穿透
  13. 数学建模 CUMCM2018年A题真题(本文由西南民族大学白白不加糖、薄荷CC糖原创)
  14. MAC 安装opencv的过程
  15. js中的“...”三个点
  16. python设置tk退出_Python3 tkinter基础 Tk quit 点击按钮退出窗体
  17. 2022年全球市场汽车租赁行业发展前景分析及市场需求调研报告
  18. 嵌入式Linux系统移植的四大步骤(详细长文,慎入!)
  19. 写网站没有模板?这几个可以下载模板的网站,非常惊艳
  20. 服务器和kad正在连接,P2P连不上kad网络怎么解决?P2P连不上kad网络的处理方法教程详解...

热门文章

  1. 4、jQuery实现的全选、反选和不选功能
  2. 并查集 HDOJ 1232 畅通工程
  3. 【百度地图API】如何制作班级地理通讯录?LBS通讯录
  4. 基于Picture Library创建的图片文档库中的上传多个文件功能(upload multiple files)报错怎么解决?...
  5. [转]笑话: 耐力惊人的三只乌龟
  6. 2021年中国工业互联网安全大赛核能行业赛道writeup之usb流量分析
  7. CV05-ResNet笔记
  8. craigslist_Craigslist,Wikipedia和丰富经济
  9. 5层模型中数据从源主机到目的主机之旅
  10. 学术青年如何克服拖延症——5条技巧助你前进