网络流24题之最长k可重区间集问题
对于每个点向后一个点连流量为k费用为0的边
对每一区间连l到r流量为1费用为r-l的边
然后最小费用最大流,输出取反
一开始写的r-l+1错了半天。。。
By:大奕哥
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=10000005,inf=1e9; 4 int head[N],d[N],f[N],l[N],r[N],a[N],s=1e9,t,n,k,cnt=-1,cost; 5 bool v[N]; 6 struct node{ 7 int to,nex,f,w,c; 8 }e[1000005]; 9 void add(int x,int y,int w,int c) 10 { 11 e[++cnt].to=y;e[cnt].w=w;e[cnt].f=x;e[cnt].c=c;e[cnt].nex=head[x];head[x]=cnt; 12 e[++cnt].to=x;e[cnt].w=0;e[cnt].f=y;e[cnt].c=-c;e[cnt].nex=head[y];head[y]=cnt; 13 } 14 queue<int>q; 15 bool spfa() 16 { 17 memset(f,-1,sizeof(f)); 18 memset(d,0x3f,sizeof(d)); 19 memset(v,0,sizeof(v)); 20 d[s]=0;v[s]=1;q.push(s); 21 while(!q.empty()) 22 { 23 int x=q.front();q.pop();v[x]=0; 24 for(int i=head[x];i!=-1;i=e[i].nex) 25 { 26 int y=e[i].to; 27 if(d[y]<=d[x]+e[i].c||!e[i].w)continue; 28 d[y]=d[x]+e[i].c;f[y]=i; 29 if(!v[y])q.push(y),v[y]=1; 30 } 31 } 32 if(d[t]>1e9)return 0; 33 int flow=inf; 34 for(int i=f[t];i!=-1;i=f[e[i].f]) 35 flow=min(flow,e[i].w); 36 for(int i=f[t];i!=-1;i=f[e[i].f]) 37 e[i].w-=flow,e[i^1].w+=flow,cost+=e[i].c*flow; 38 return 1; 39 } 40 int main() 41 { 42 scanf("%d%d",&n,&k);int num=0; 43 memset(head,-1,sizeof(head)); 44 for(int i=1;i<=n;++i) 45 { 46 scanf("%d%d",&l[i],&r[i]); 47 a[++num]=l[i];a[++num]=r[i]; 48 } 49 sort(a+1,a+1+num); 50 num=unique(a+1,a+1+num)-a-1; 51 for(int i=1;i<=n;++i) 52 { 53 int x=r[i]-l[i]; 54 l[i]=lower_bound(a+1,a+1+num,l[i])-a; 55 r[i]=lower_bound(a+1,a+1+num,r[i])-a; 56 add(l[i],r[i],1,-x); 57 } 58 for(int i=1;i<num;++i) 59 add(i,i+1,k,0);t=num+1; 60 add(num,t,k,0); 61 add(0,1,k,0);s=0; 62 while(spfa()); 63 printf("%d\n",-cost); 64 return 0; 65 }
转载于:https://www.cnblogs.com/nbwzyzngyl/p/8399221.html
网络流24题之最长k可重区间集问题相关推荐
- 【刷题】LOJ 6014 「网络流 24 题」最长 k 可重区间集
题目描述 给定实直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取出开区间集合 \(S \subseteq ...
- P3358 最长k可重区间集问题(网络流:串联思想)
P3358 最长k可重区间集问题 这是一个经典模型,给定n个开区间,选择一些区间使得每个位置被覆盖次数不超过k,并最大化选择的区间长度之和. 首先一个直接的想法就是每一个区间匹配了它所对应的点,但是我 ...
- 网络流二十四题 ————(二十一)、P3358 最长k可重区间集问题 费用流并联与串联选择
https://www.luogu.com.cn/problem/solution/P3358 洛谷大佬们题解写的很棒,我就不献丑了. 说下我的理解吧,可以把这个限制过程当初物理中的电路并联与串联.流 ...
- [网络流24题] 最长k可重区间集
对于区间 u->v ,连接边 u->v,权值为-len,容量为1,之后对每个点 i->i+1,连边 i->i+1,容量为k,权值为0,求区间最左端点到最右端点的费用流,费用相反 ...
- 洛谷 - P3358 最长k可重区间集问题(最大费用最大流+思维建边)
题目链接:点击查看 题目大意:给出n个开区间,现在要求从中选取一定数量的区间,需要满足: 对于任意点x,所选取的区间中包含点x的个数小于等于k 区间长度和最大 要求输出最长的区间长度和 题目分析:一开 ...
- 最长k可重区间集问题最长k可重线段集问题
题解: 洛谷上这两题的题意都是有问题的 按照标程题意不应该是开区间而是左开右闭区间 然后连边比较巧妙 我们可以看成选k条不相交的路径,其中i-i+1中有k条边 所以建图i-i+1流量为k,权值为0 l ...
- P3357 最长k可重线段集问题 网络流
P3357 最长k可重线段集问题 题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\sub ...
- 洛谷P3357:最长k可重线段集问题(网络流)
解析 本题的建模方法有很多,我的做法是补集思想转化成志愿者招募然后按照那道题的做法直接做,看题解更多是采用的对于不冲突的线段首尾加边的做法. 在前一道最长k可重区间问题中这两种做法谈不上孰优孰劣,但本 ...
- P3357 最长k可重线段集问题(网络流/串联/拆点)
P3357 最长k可重线段集问题 对于n条开线段,选择一个子集使得任意x=p和子集相交的直线个数小于等于k,并使得选择的线段长度之和最大. 这道题看上去和区间集没有什么区别,只是费用发生变化,但是要注 ...
最新文章
- 如何从一个表中选择另一个表中不存在的所有记录?
- 每日一皮:强大的sudo ...
- 入门必看!给零基础新手的超快速色彩知识小科普
- 使用ueditor实现多图片上传案例——截取字符串层Util(SubString_text)
- [essay]关机三天
- 【CTF WEB】反序列化
- 电商、快递最后一公里的解决方案
- c语言函数实际参数,C语言:函数声明与定义的参数不一致问题,后果可能很严重哦!!!!!...
- js 格式化 java时间格式化_用JavaScript(js)对时间格式化
- c 与mysql连接_c与mysql的连接
- 水位传感器工作原理及应用
- html制作dnf,DNF教你如何不花一分钱制作90顶级史诗
- SOLIDWORKS软件转Dwg格式教程
- H G W S哪一个不是状态函数_复变函数学习笔记(13)——单位圆盘上的自同构群(用了近世代数)...
- 方舟非专用服务器稳定吗,方舟非专用服务器
- halcon物体周边毛刺检测
- 【NVMe2.0b 14】NVMe Admin Command Set
- iOS 仿YY直播心形动画 烟花动画
- matlab彩色转灰度图代码,彩色图转灰度图 matlab 实现代码
- html 404错误页面模板,50款国外非常有意思的网页404错误页面模板