给定N个带权的开区间,第i个区间覆盖区间(ai,bi),权值为wi。现在要求挑出一些区间使得总权值最大,并且满足实轴上任意一个点被覆盖不超过K次。

1<=K<=N<=200.1<=ai<bi<=100000.1<=wi<=100000.

最小费用最大流。

将所有区间端点离散化到整数1到M,每个数对应一个点。

源点向整数1点连一条容量为K费用为0的边。

整数i点向整数i+1点连一条容量为正无穷费用为0的边。(1<=i<M).

整数M点向汇点连一条容量为正无穷费用为0的边。

每个区间由aai点向bbi点连一条容量为1费用为-wi的边(aai和bbi为区间左右端点离散后的值)。

最小费用最大流取反即为答案。

考虑对于一条aai向bbi的边,费用为负值必然优先选择,使得区间(aai,bbi)剩余流量减一,对应题中(ai,bi)的点剩余覆盖次数减一。注意到本题区间为开区间,所以两个区间相连不影响结果。

 #include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int dian=;
const int bian=;
const int INF=0x3f3f3f3f;
int zkh[dian],ykh[dian],khqz[dian];
int zl[dian],yl[dian];
int h[dian],nxt[bian],ver[bian],val[bian],cos[bian],minn[dian],with[dian];
int v[dian],d[dian];
int n,k,tot,bula;
int S,T;
void add(int a,int b,int c,int d){
tot++;ver[tot]=b;val[tot]=c;cos[tot]=d;nxt[tot]=h[a];h[a]=tot;
tot++;ver[tot]=a;val[tot]=;cos[tot]=-d;nxt[tot]=h[b];h[b]=tot;
}
bool tell(){
memset(v,,sizeof(v));
memset(d,0x3f,sizeof(d));
memset(with,,sizeof(with));
memset(minn,0x3f,sizeof(minn));
queue<int>q;
q.push(S);
v[S]=;
d[S]=;
while(!q.empty()){
int x=q.front();
q.pop();
v[x]=;
for(int i=h[x];i;i=nxt[i]){
int y=ver[i];
if(d[y]>d[x]+cos[i]&&val[i]){
d[y]=d[x]+cos[i];
minn[y]=min(minn[x],val[i]);
with[y]=i;
if(!v[y]){
v[y]=;
q.push(y);
}
}
}
}
if(d[T]==0x3f3f3f3f)
return ;
return ;
}
int zeng(){
for(int i=T;i!=S;i=ver[with[i]^]){
val[with[i]]-=minn[T];
val[with[i]^]+=minn[T];
}
return minn[T]*d[T];
}
int dinic_cost(){
int r=;
while(tell())
r+=zeng();
return r;
}
int main(){
int cas;
scanf("%d",&cas);
while(cas--){
memset(h,,sizeof(h));
memset(nxt,,sizeof(nxt));
tot=;
bula=;
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d%d%d",&zkh[i],&ykh[i],&khqz[i]);
//本人太过蒟蒻,下文大段while语句(离散化)不知所云,建议跳过。
int hhd;
while(){
hhd=INF;
for(int i=;i<=n;i++)
if(hhd>zkh[i])
hhd=zkh[i];
if(hhd==INF)
break;
bula++;
for(int i=;i<=n;i++)
if(hhd==zkh[i]){
if(ykh[i]==INF){
zkh[i]=INF;
yl[i]=bula;
}
else{
zkh[i]=ykh[i];
ykh[i]=INF;
zl[i]=bula;
}
}
}
S=bula+,T=bula+;
for(int i=;i<bula;i++)
add(i,i+,INF,);
add(S,,k,);
add(bula,T,INF,);
for(int i=;i<=n;i++)
add(zl[i],yl[i],,-khqz[i]);
printf("%d\n",-dinic_cost());
}
return ;
}

poj 3680 Intervals的更多相关文章

  1. poj 3680 Intervals(费用流)

    http://poj.org/problem?id=3680 巧妙的构图. 题目:给定N个区间(ai,bi)权值wi,求最大权和且每个点最多覆盖K次. 构图:将区间端点离散化,将第i个点连第i+1个点 ...

  2. POJ 3680 Intervals(费用流)

    Intervals Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5762   Accepted: 2288 Descrip ...

  3. POJ 3680 Intervals(费用流+负权优化)

    [题目链接] http://poj.org/problem?id=3680 [题目大意] 有N个带权重的区间,现在要从中选取一些区间, 要求任意点都不被超过K个区间所覆盖,请最大化总的区间权重. [题 ...

  4. 网络流(最大费用最大流) :POJ 3680 Intervals

    Intervals Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7218   Accepted: 3011 Descrip ...

  5. POJ 3680: Intervals【最小费用最大流】

    题目大意:你有N个开区间,每个区间有个重量wi,你要选择一些区间,使得满足:每个点被不超过K个区间覆盖的前提下,重量最大 思路:感觉是很好想的费用流,把每个区间首尾相连,费用为该区间的重量的相反数(由 ...

  6. POJ 3680 Intervals 最小费用最大流(MCMF算法)

    题意:给出 n ,k 表示接下来给你 n 段开区间,每段区间都有它的权值,问选出一些区间,使它的权值最大,并且在实轴上的每个点,不得超过 k次被覆盖. 思路:首先要理解建图思路,首先有一个基图,相邻点 ...

  7. POJ No.3680 Intervals

    2016-06-01 22:01:39 题目链接: POJ No.3680 Intervals 题目大意: 给定N个带权区间,最多可以重复选一个点M次,求出一种选法使得所得权最大 解法: 费用流 建模 ...

  8. POJ 3680:Intervals(最小费用最大流)***

    http://poj.org/problem?id=3680 题意:给出n个区间[Li,Ri],每个区间有一个权值wi,要使得每个点都不被超过k个区间覆盖(最多能被k个区间覆盖),如果选取了第i个区间 ...

  9. Intervals POJ - 3680 (MCMF)

    给你一些区间,每个区间都有些价值.取一个区间就能获得对应的价值,并且一个点不能覆盖超过k次,问你最大的价值是多少. 我们可以把这些区间放到一维的轴上去,然后我们可以把它看成一个需要从左到右的过程,然后 ...

随机推荐

  1. iOS 摇一摇的功能

    效果如下 相关素材 相关代码如下 #import "ShakeViewController.h" #import <AudioToolbox/AudioToolbox.h&g ...

  2. Android—定位

    public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button ...

  3. pygame开发PC端微信打飞机游戏

    pygame开发PC端微信打飞机游戏 一.项目简介 1. 介绍 本项目类似曾经火爆的微信打飞机游戏.游戏将使用Python语言开发,主要用到pygame的API.游戏最终将会以python源文件gam ...

  4. 学习Maven之Maven Surefire Plugin(JUnit篇)

    1.maven-surefire-plugin是个什么鬼? 如果你执行过mvn test或者执行其他maven命令时跑了测试用例,你就已经用过maven-surefire-plugin了.maven- ...

  5. IT人经济思维之投资 - 创业与投资系列文章

    前面笔者写过一个文(IT从业者的职业规划),主要通过笔者的从业道路的经验,介绍了IT从业者的职业选择道路问题,主要从技术.业务和管理三大方面进行了描述.然后,通过文(IT从业者的职业道路(从程序员到部 ...

  6. goldengate abended with no data found

    先来看下报错ggserr.log: 2016-12-22 04:48:52  WARNING OGG-02544  Unhandled error (ORA-26787: The row with k ...

  7. mysql while,loop,repeat循环,符合条件跳出循环

    1.while循环 DELIMITER $$ DROP PROCEDURE IF EXISTS `sp_test_while`$$ CREATE PROCEDURE `sp_test_while`( ...

  8. 【转载】Java垃圾回收机制

    原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...

  9. 【推荐】CentOS安装Tomcat-7.0.57+启动配置+安全配置+性能配置

    注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. #准备工作# 在安装Tomcat之前,请确保已经安装了JDK-1.7环境,具体见<CentOS安装JDK-1.7>. ...

  10. 3-1 Linux文件管理类命令详解

    根据马哥Linux初级 03-01整理 1. 目录管理 ls cd pwd mkdir rmdir tree 2. 文件管理 touch stat file rm cp mv nano 3. 日期时间 ...