«问题描述:

«编程任务:
对于给定的开区间集合I和正整数k,计算开区间集合I的最长k可重区间集的长度。
«数据输入:
由文件interv.in提供输入数据。文件的第1 行有2 个正整数n和k,分别表示开区间的
个数和开区间的可重迭数。接下来的n行,每行有2个整数,表示开区间的两个端点坐标。
«结果输出:
程序运行结束时,将计算出的最长k可重区间集的长度输出到文件interv.out中。
输入文件示例 输出文件示例
interv.in
4 2
1 7
6 8
7 10

9 13

interv.out

15

/*
朴素的做法:
把k看作是k条路径,一条路径只能由不重复的区间组成,每个区间只能用一次,然后拆点跑最大费用流。
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#define N 1010
#define inf 1000000000
using namespace std;
int head[N],dis[N],inq[N],fa[N],n,k,S,T,cnt=;
struct Node{int l,r;}a[N];
struct node{int v,f,w,pre;}e[N*];
queue<int> q;
void add(int u,int v,int f,int w){
e[++cnt].v=v;e[cnt].f=f;e[cnt].w=w;e[cnt].pre=head[u];head[u]=cnt;
e[++cnt].v=u;e[cnt].f=;e[cnt].w=-w;e[cnt].pre=head[v];head[v]=cnt;
}
bool spfa(){
for(int i=;i<=T;i++) dis[i]=inf;
dis[S]=;q.push(S);
while(!q.empty()){
int u=q.front();q.pop();inq[u]=;
for(int i=head[u];i;i=e[i].pre)
if(e[i].f&&dis[e[i].v]>dis[u]+e[i].w){
dis[e[i].v]=dis[u]+e[i].w;
fa[e[i].v]=i;
if(!inq[e[i].v]){
inq[e[i].v]=;
q.push(e[i].v);
}
}
}
return dis[T]!=inf;
}
int updata(){
int i=fa[T],x=inf;
while(i){
x=min(x,e[i].f);
i=fa[e[i^].v];
}
i=fa[T];
while(i){
e[i].f-=x;
e[i^].f+=x;
i=fa[e[i^].v];
}
return x*dis[T];
}
bool cmp(const Node&x,const Node&y){
if(x.l==y.l) return x.r<y.r;
return x.l<y.l;
}
int main(){
freopen("interv.in","r",stdin);
freopen("interv.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].l,&a[i].r);
sort(a+,a+n+,cmp);
S=;T=n*+;int SS=n*+;
add(S,SS,k,);
for(int i=;i<=n;i++){
add(SS,i,inf,);
add(i+n,T,inf,);
add(i,i+n,,a[i].l-a[i].r);
}
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(a[i].r<=a[j].l) add(i+n,j,,);
int minv=;
while(spfa()) minv+=updata();
printf("%d",-minv);
return ;
}
/*
还有一种神奇的做法:
离散化所有区间的端点,把每个端点看做一个顶点,建立附加源S汇T。
建图如下:
从S到顶点1(最左边顶点)连接一条容量为K,费用为0的有向边。
从顶点2N(最右边顶点)到T连接一条容量为K,费用为0的有向边。
从顶点i到顶点i+1(i+1<=2N),连接一条容量为无穷大,费用为0的有向边。
对于每个区间[a,b],从a对应的顶点i到b对应的顶点j连接一条容量为1,费用为区间长度的有向边。
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#define N 1010
#define inf 1000000000
using namespace std;
int l[N],r[N],len[N],a[N],head[N],dis[N],inq[N],fa[N],n,k,S,T,cnt=;
struct node{int v,f,w,pre;}e[N*];
queue<int> q;
void add(int u,int v,int f,int w){
e[++cnt].v=v;e[cnt].f=f;e[cnt].w=w;e[cnt].pre=head[u];head[u]=cnt;
e[++cnt].v=u;e[cnt].f=;e[cnt].w=-w;e[cnt].pre=head[v];head[v]=cnt;
}
bool spfa(){
for(int i=;i<=T;i++) dis[i]=inf;
dis[S]=;q.push(S);
while(!q.empty()){
int u=q.front();q.pop();inq[u]=;
for(int i=head[u];i;i=e[i].pre)
if(e[i].f&&dis[e[i].v]>dis[u]+e[i].w){
dis[e[i].v]=dis[u]+e[i].w;
fa[e[i].v]=i;
if(!inq[e[i].v]){
inq[e[i].v]=;
q.push(e[i].v);
}
}
}
return dis[T]!=inf;
}
int updata(){
int i=fa[T],x=inf;
while(i){
x=min(x,e[i].f);
i=fa[e[i^].v];
}
i=fa[T];
while(i){
e[i].f-=x;
e[i^].f+=x;
i=fa[e[i^].v];
}
return x*dis[T];
}
int main(){
//freopen("interv.in","r",stdin);
//freopen("interv.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%d%d",&l[i],&r[i]);
a[i*-]=l[i];a[i*]=r[i];len[i]=r[i]-l[i];
}
sort(a+,a+n*+);
for(int i=;i<=n;i++){
l[i]=lower_bound(a+,a+n*+,l[i])-a;
r[i]=lower_bound(a+,a+n*+,r[i])-a;
}
S=;T=n*+;
add(,,k,);add(n*,T,k,);
for(int i=;i<n*;i++) add(i,i+,inf,);
for(int i=;i<=n;i++) add(l[i],r[i],,-len[i]);
int minv=;
while(spfa()) minv+=updata();
printf("%d",-minv);
return ;
}

最新文章

  1. c#.net 生成清晰缩略图
  2. HTML5 History API 实现无刷新跳转
  3. 微信公众号网页开发-jssdk config配置参数生成(Java版)
  4. meteor报错之:MongoDB had an unspecified uncaught exception.
  5. HTML5,jQuery,ajax基础面试
  6. oracle基础备份和还原
  7. ubuntu修改设备名称
  8. mysql索引优化
  9. Android开发环境搭建全程演示(jdk+eclipse+android sdk)
  10. opencv学习笔记(四)投影
  11. Maven开发环境的搭建,含jetty调试[简单明了]
  12. Java基础之在窗口中绘图——绘制曲线(CurveApplet 1)
  13. c++ goto的使用
  14. 使用MySQL Proxy解决MySQL主从同步延迟
  15. 数据挖掘10大算法(1)——PageRank
  16. usaco 奶牛接力
  17. loadlibrary(xxx.dll) 失败 返回14001 由于应用程序配置不正确 应用程序未能启动.重新安装应用程序可能会纠正这个问 .
  18. leetcode第四题--Add Two Numbers
  19. javascript四舍五入tofixed
  20. 用js来实现那些数据结构(数组篇01)

热门文章

  1. java中 二进制 八进制 十六进制 十进制 相互转换 最简方法
  2. BZOJ3679: 数字之积(数位dp)
  3. SAP事件 Event Flow(转载)
  4. 【前端_js】解决ajax跨域请求数据
  5. PHP PDO 使用类
  6. Foxmail登录不了网易企业邮箱解决办法
  7. 05.VUE学习之表达式
  8. django-simple-captcha 验证码干扰线随机点位
  9. java+Mysql大数据的一些优化技巧
  10. Python9-IO模型-day41