http://poj.org/problem?id=3680

巧妙的构图。

题目:给定N个区间(ai,bi)权值wi,求最大权和且每个点最多覆盖K次。

构图:将区间端点离散化,将第i个点连第i+1个点花费为0,容量为INF,即addedge(i,i+1,0,INF)(可用来跳过一些区间);

   再处理N个区间(ai,bi),addedge(ai,bi,-wi,1);

   最后源点连第一个点,addedge(src,1,0,k);最后一个点连汇点,addedge(n,sink,0,k)。

原理:构完图之后做最小费用最大流,其实就是找不大于K条增广路。如果两个区间有交集,则不能一次流过,要分成两条增广路流过;反之,则可一次流过。

 /*
*Author: Zhaofa Fang
*Created time: 2013-07-19-10.41
*Language: C++
*/
#include <cstdio>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <utility>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std; typedef long long ll;
typedef pair<int,int> PII;
#define DEBUG(x) cout<< #x << ':' << x << endl
#define FOR(i,s,t) for(int i = (s);i <= (t);i++)
#define FORD(i,s,t) for(int i = (s);i >= (t);i--)
#define REP(i,n) for(int i=0;i<(n);i++)
#define REPD(i,n) for(int i=(n-1);i>=0;i--)
#define PII pair<int,int>
#define PB push_back
#define MP make_pair
#define ft first
#define sd second
#define lowbit(x) (x&(-x))
#define INF (1<<30)
#define eps (1e-8) const int maxm = ;
const int maxn = ;
int ans,anscost;
struct Edge {
int u,v,cost,cap,flow,next;
}et[maxm];
int S,T;
int eh[maxn],tot,low[maxn],p[maxn],dist[maxn];
bool vist[maxn];
bool spfa(){
queue<int>que;
memset(vist,,sizeof(vist));
memset(p,-,sizeof(p));
fill(dist,dist+maxn,INF);
vist[S] = ,low[S] = INF,dist[S] = ;
que.push(S);
while(!que.empty()){
int u = que.front();
que.pop();
vist[u] = false;
for(int i=eh[u];i!=-;i=et[i].next){
int v = et[i].v,cost = et[i].cost,cap=et[i].cap,flow=et[i].flow;
if(flow < cap && dist[u] + cost < dist[v]){
dist[v] = dist[u] + cost;
p[v] = i;
low[v] = min(low[u],cap-flow);
if(!vist[v]){
vist[v] = ;
que.push(v);
}
}
}
}
return dist[T]!=INF;
}
void costflow(){
ans = ,anscost = ;
int num=;
while(spfa()){
int x = p[T];
ans += low[T];
anscost += low[T]*dist[T];
while(x!=-){
et[x].flow += low[T];
et[x^].flow -= low[T];
et[x^].cost = -et[x].cost;
x = p[et[x].u];
}
}
}
void add(int u,int v,int cost,int cap,int flow){
Edge e = {u,v,cost,cap,flow,eh[u]};
et[tot] = e;
eh[u] = tot ++;
}
void addedge(int u,int v,int cost,int cap){
add(u,v,cost,cap,);add(v,u,-cost,,);
}
void init(){
tot = ;
memset(eh,-,sizeof(eh));
}
int X[maxn];
int a[maxn],b[maxn],w[maxn];
int find(int key,int n){
int r = lower_bound(X,X+n,key)-X;
return r+;
}
int main(){
//freopen("in","r",stdin);
//freopen("out","w",stdout);
int Ca;
scanf("%d",&Ca);
while(Ca--){
int N,K;
scanf("%d%d",&N,&K);
int cnt = ;
init();
REP(i,N){
scanf("%d%d%d",&a[i],&b[i],&w[i]);
X[cnt++]=a[i];X[cnt++]=b[i];
w[i] = -w[i];
}
sort(X,X+cnt);
int n = ;
FOR(i,,cnt-){
if(X[i]!=X[i-])X[n++]=X[i];
}
REP(i,n-){
addedge(i+,i+,,INF);
}
REP(i,N){
int l = find(a[i],n);
int r = find(b[i],n);
addedge(l,r,w[i],);
}
addedge(,,,K);
addedge(n,n+,,K);
S = ;T = n+;costflow();
printf("%d\n",-anscost); }
return ;
}

1300+MS

poj 3680 Intervals(费用流)的更多相关文章

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

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

  2. poj 3680(最小费用最大流)

    题目链接:http://poj.org/problem?id=3680 思路:因为N<=200,而区间范围为[1,100000],因此需要离散化,去重,然后就是建图了相连两点连边,容量为k,费用 ...

  3. POJ 2516 基础费用流

    题意       有n个顾客,m个供应商,k种货物,给你顾客对于每种货物的要求个数,和供应商对于每种货物的现有量,以及供应每种货物的时候供应商和顾客之间的运输单价,问你满足所有顾客的前提下的最小运输费 ...

  4. POJ 2135 简单费用流

    题意:       题意是一个人他要从牧场1走到牧场n然后在走回来,每条路径只走一次,问全程的最短路径是多少. 思路:        这个题目挺简单的吧,首先要保证每条边只能走一次,然后还要要求费用最 ...

  5. POJ 3680 Intervals(费用流)

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

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

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

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

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

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

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

  9. poj 3680 Intervals

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

随机推荐

  1. Java开发工具IntelliJ IDEA单元测试和代码覆盖率图解

    原文 http://www.cnblogs.com/xiongmaopanda/p/3314660.html Java开发工具IntelliJ IDEA使用教程:单元测试和代码覆盖率 本文将展示如何使 ...

  2. Android客户端与服务器交互中的token

    学习Token Token是什么? Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Tok ...

  3. schema://host[:port#]/path/.../[?query-string][#anchor]

    1:http协议状态200 OK最常见的就是成功响应状态码200了, 这表明该请求被成功地完成,所请求的资源发送回客户端 302 Found重定向,新的URL会在response 中的Location ...

  4. node.js介绍

    官网说明: Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable ...

  5. SharePoint 2013 讨论板列表"Connect to Outlook" 不可用解决方案

    本文讲述 SharePoint 2013 讨论板列表"Connect to Outlook" 不可用解决方案. SharePoint中的讨论板列表是可以集成到Outlook里面去的 ...

  6. Qt on Android:QTableView不显示选中虚框

    在使用 QTableView 或 QTableWidget 时.有时我们不想要选中虚框,能够实现一个 ItemDelegate ,重写 drawFocus() 和 drawCheck()  两个虚函数 ...

  7. ChartControl一个小Demo

    我X轴设置的是时间,类型是DatetimeY轴设置的是数量,类型是Numerical当日期不一样时显示曲线正常,但是如果是同一天的话就成了下面的效果 怎么做才能让全部是同一天的时候显示小时为单位的曲线 ...

  8. node.js(四)path优化(路径优化)

    1.normalize函数的基本用法 normalize函数将不符合规范的路径经过格式化转换为标准路径,解析路径中的.与..外,还能去掉多余的斜杠. 如下示例: var path = require( ...

  9. OCP-1Z0-053-V12.02-501题 【转】

    http://blog.csdn.net/rlhua/article/details/12225237 501.Note the output of the following query; SQL& ...

  10. OC-方法

    1.类声明 @interface Person : NSObject { @public int _height; int _weight; int _age; } // 如果你不想每次使用方法都需要 ...