poj 3680 Intervals(费用流)
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(费用流)的更多相关文章
- POJ 3680: Intervals【最小费用最大流】
题目大意:你有N个开区间,每个区间有个重量wi,你要选择一些区间,使得满足:每个点被不超过K个区间覆盖的前提下,重量最大 思路:感觉是很好想的费用流,把每个区间首尾相连,费用为该区间的重量的相反数(由 ...
- poj 3680(最小费用最大流)
题目链接:http://poj.org/problem?id=3680 思路:因为N<=200,而区间范围为[1,100000],因此需要离散化,去重,然后就是建图了相连两点连边,容量为k,费用 ...
- POJ 2516 基础费用流
题意 有n个顾客,m个供应商,k种货物,给你顾客对于每种货物的要求个数,和供应商对于每种货物的现有量,以及供应每种货物的时候供应商和顾客之间的运输单价,问你满足所有顾客的前提下的最小运输费 ...
- POJ 2135 简单费用流
题意: 题意是一个人他要从牧场1走到牧场n然后在走回来,每条路径只走一次,问全程的最短路径是多少. 思路: 这个题目挺简单的吧,首先要保证每条边只能走一次,然后还要要求费用最 ...
- POJ 3680 Intervals(费用流)
Intervals Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5762 Accepted: 2288 Descrip ...
- 网络流(最大费用最大流) :POJ 3680 Intervals
Intervals Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7218 Accepted: 3011 Descrip ...
- POJ 3680 Intervals(费用流+负权优化)
[题目链接] http://poj.org/problem?id=3680 [题目大意] 有N个带权重的区间,现在要从中选取一些区间, 要求任意点都不被超过K个区间所覆盖,请最大化总的区间权重. [题 ...
- POJ 3680 Intervals 最小费用最大流(MCMF算法)
题意:给出 n ,k 表示接下来给你 n 段开区间,每段区间都有它的权值,问选出一些区间,使它的权值最大,并且在实轴上的每个点,不得超过 k次被覆盖. 思路:首先要理解建图思路,首先有一个基图,相邻点 ...
- poj 3680 Intervals
给定N个带权的开区间,第i个区间覆盖区间(ai,bi),权值为wi.现在要求挑出一些区间使得总权值最大,并且满足实轴上任意一个点被覆盖不超过K次. 1<=K<=N<=200.1< ...
随机推荐
- Java开发工具IntelliJ IDEA单元测试和代码覆盖率图解
原文 http://www.cnblogs.com/xiongmaopanda/p/3314660.html Java开发工具IntelliJ IDEA使用教程:单元测试和代码覆盖率 本文将展示如何使 ...
- Android客户端与服务器交互中的token
学习Token Token是什么? Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Tok ...
- schema://host[:port#]/path/.../[?query-string][#anchor]
1:http协议状态200 OK最常见的就是成功响应状态码200了, 这表明该请求被成功地完成,所请求的资源发送回客户端 302 Found重定向,新的URL会在response 中的Location ...
- node.js介绍
官网说明: Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable ...
- SharePoint 2013 讨论板列表"Connect to Outlook" 不可用解决方案
本文讲述 SharePoint 2013 讨论板列表"Connect to Outlook" 不可用解决方案. SharePoint中的讨论板列表是可以集成到Outlook里面去的 ...
- Qt on Android:QTableView不显示选中虚框
在使用 QTableView 或 QTableWidget 时.有时我们不想要选中虚框,能够实现一个 ItemDelegate ,重写 drawFocus() 和 drawCheck() 两个虚函数 ...
- ChartControl一个小Demo
我X轴设置的是时间,类型是DatetimeY轴设置的是数量,类型是Numerical当日期不一样时显示曲线正常,但是如果是同一天的话就成了下面的效果 怎么做才能让全部是同一天的时候显示小时为单位的曲线 ...
- node.js(四)path优化(路径优化)
1.normalize函数的基本用法 normalize函数将不符合规范的路径经过格式化转换为标准路径,解析路径中的.与..外,还能去掉多余的斜杠. 如下示例: var path = require( ...
- OCP-1Z0-053-V12.02-501题 【转】
http://blog.csdn.net/rlhua/article/details/12225237 501.Note the output of the following query; SQL& ...
- OC-方法
1.类声明 @interface Person : NSObject { @public int _height; int _weight; int _age; } // 如果你不想每次使用方法都需要 ...