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. jQuery随记

    每次申明一个jQuery对象的时候,返回的是jQuery.prototype.init对象,很多人就会不明白,init明明是jQuery.fn的方法啊,实际上这里不是方法,而是init的构造函数,因为 ...

  2. 给flash文件加超链接[兼容主流浏览器]

    <div style="position: relative;"> <a style="width: 640px; height: 90px; posi ...

  3. android TextView 带滚动条,和ScrollView 用法(暂时觉得ScrollView滑动速度比较快)

    本来是想做一个显示文字信息的,当文字很多时View的高度不能超过一个固定的值,当文字很少时View的高度小于那个固定值时,按View的高度显示.因为ScrollView没有maxHeight,无法满足 ...

  4. GDI编程

    图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出.GDI负责Wind ...

  5. chapter 10 统计检验

    1.permutation test 用途:用于检验两组数据是否出生于同一分布 思路:如果产生于同一分布,两组数据混合,重新排列后,计算的基于两组数据的函数值(均值,中位数,方差等,下面程序中使用f指 ...

  6. hdu 5540 Secrete Master Plan(水)

    Problem Description Master Mind KongMing gave Fei Zhang a secrete master plan stashed × matrix, but ...

  7. Magento - get Attribute Options of the dropdown type attribute

      $attribute_code = "color"; $attribute_details = Mage::getSingleton("eav/config" ...

  8. vb.net中让控件内容为空(Control类)

    在平常的敲系统中大家有没有遇到需要让Textbox控件或者其他的控件的显示内容为空,以前直接的做法是直接等于空值,如果此类控件有很多,都需要空值,难道都要设置一下它的值为空嘛,显然这是一个笨办法,有没 ...

  9. ODBC与JDBC比較

    在学习J2EE的JDBC过程中,刚见到JDBC就立即联想到了ODBC,并且我们能够肯定他们之间有必定的关系.開始学它的时候还是认为有点晕,于是就查了非常多资料,与比較熟悉的ODBC进行了比較. 先各自 ...

  10. Java线程之二 锁定与等待堵塞原理图

    如上图所看到的.