POJ 3680: Intervals【最小费用最大流】
题目大意:你有N个开区间,每个区间有个重量wi,你要选择一些区间,使得满足:每个点被不超过K个区间覆盖的前提下,重量最大
思路:感觉是很好想的费用流,把每个区间首尾相连,费用为该区间的重量的相反数(由于要最大,所以是求最大费用最大流),容量为1,至于不超过K的限制,只要从源点到第一个点的流量为K就行,剩下每个相邻的点相连,费用为0,流量只要大于的等于K就可以(我取的正无穷)
//poj3680
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
#define maxn 120090
#define esp 0.00001
#define inf 0x3f3f3f3f
using namespace std;
int head[maxn],point[maxn],flow[maxn],next[maxn];
int now=0,value[maxn],k,xx,yy,vv,x[maxn],y[maxn];
int v[maxn],h=0,inte[maxn],id[maxn],root[maxn],n;
int dist[maxn],pre[maxn],j;
void add(int x,int y,int f,int v)
{
next[++now]=head[x];
head[x]=now;
point[now]=y;
flow[now]=f;
value[now]=v;
root[now]=x;
next[++now]=head[y];
head[y]=now;
point[now]=x;
flow[now]=0;
value[now]=-v;
root[now]=y;
}
int spfa(int s,int t)
{
for(int i=1;i<=j;i++)dist[i]=200000;
dist[t]=200000;
dist[s]=0;
int visit[maxn]={0};
visit[s]=1;
queue<int>q;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
visit[u]=0;
for(int i=head[u];i;i=next[i])
{
int k=point[i];
if(dist[u]+value[i]<dist[k] && flow[i])
{
dist[k]=dist[u]+value[i];
pre[k]=i;
if(!visit[k])
{
visit[k]=1;
q.push(k);
}
}
}
}
if(dist[t]==200000)return 0;else return 1;
}
int main()
{
int tt;
scanf("%d",&tt);
while(tt--)
{
int ans=0;
now=0;h=0;
memset(head,0,sizeof(head));
memset(pre,0,sizeof(pre));
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&xx,&yy,&vv);
x[i]=xx;y[i]=yy;v[i]=vv;
inte[++h]=xx;inte[++h]=yy;
}
sort(inte+1,inte+1+h);
j=1;
id[inte[1]]=1;
for(int i=2;i<=h;i++)
{
if(inte[i]!=inte[j])
{
inte[++j]=inte[i];
id[inte[j]]=j;
}
}
for(int i=1;i<=j;i++)
add(i,i+1,inf,0);
for(int i=1;i<=n;i++)
{
add(id[x[i]],id[y[i]],1,-v[i]);
}
int s=maxn-10,t=maxn-100;
add(s,1,k,0);
add(j,t,k,0);
while(spfa(s,t))
{
int e=pre[t],minx=flow[e];
while(e)
{
minx=min(minx,flow[e]);
e=pre[root[e]];
}
e=pre[t];
while(e)
{
flow[e]-=minx;
flow[((e-1)^1)+1]+=minx;
e=pre[root[e]];
}
ans+=dist[t]*minx;
}
printf("%d\n",-ans);
}
return 0;
}
POJ 3680: Intervals【最小费用最大流】的更多相关文章
- POJ 3680 Intervals 最小费用最大流(MCMF算法)
题意:给出 n ,k 表示接下来给你 n 段开区间,每段区间都有它的权值,问选出一些区间,使它的权值最大,并且在实轴上的每个点,不得超过 k次被覆盖. 思路:首先要理解建图思路,首先有一个基图,相邻点 ...
- POJ 3680 Intervals(费用流)
Intervals Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5762 Accepted: 2288 Descrip ...
- POJ 3680 Intervals(费用流+负权优化)
[题目链接] http://poj.org/problem?id=3680 [题目大意] 有N个带权重的区间,现在要从中选取一些区间, 要求任意点都不被超过K个区间所覆盖,请最大化总的区间权重. [题 ...
- Going Home POJ - 2195 (最小费用最大流)
On a grid map there are n little men and n houses. In each unit time, every little man can move one ...
- poj 3680 Intervals(费用流)
http://poj.org/problem?id=3680 巧妙的构图. 题目:给定N个区间(ai,bi)权值wi,求最大权和且每个点最多覆盖K次. 构图:将区间端点离散化,将第i个点连第i+1个点 ...
- poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙
/** 题目:poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙 链接:http://poj.org/problem?id=3680 题意:给定n个区间,每个区间(ai,bi ...
- POJ 2195:Going Home(最小费用最大流)
http://poj.org/problem?id=2195 题意:有一个地图里面有N个人和N个家,每走一格的花费是1,问让这N个人分别到这N个家的最小花费是多少. 思路:通过这个题目学了最小费用最大 ...
- poj 2195 二分图带权匹配+最小费用最大流
题意:有一个矩阵,某些格有人,某些格有房子,每个人可以上下左右移动,问给每个人进一个房子,所有人需要走的距离之和最小是多少. 貌似以前见过很多这样类似的题,都不会,现在知道是用KM算法做了 KM算法目 ...
- POJ 2157 Evacuation Plan [最小费用最大流][消圈算法]
---恢复内容开始--- 题意略. 这题在poj直接求最小费用会超时,但是题意也没说要求最优解. 根据线圈定理,如果一个跑完最费用流的残余网络中存在负权环,那么顺着这个负权环跑流量为1那么会得到更小的 ...
- POJ 2195 Going Home(最小费用最大流)
http://poj.org/problem?id=2195 题意 : N*M的点阵中,有N个人,N个房子.让x个人走到这x个房子中,只能上下左右走,每个人每走一步就花1美元,问当所有的人都归位了之 ...
随机推荐
- Web API性能优化(一)压缩
简单的应用场景:分页获取日志JSON信息. 很简单的实现,简单的记录一下 未压缩时候 使用PostMan请求http://localhost:34390/api/gpm/syslog/page?pag ...
- html/css实现聊天布局
效果图 项目结构 html代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" / ...
- maven编译报错 -source 1.5 中不支持 lambda(或diamond) 表达式,编码 UTF-8 的不可映射字符
在用maven编译项目是由于项目中用了jdk 1.8, 编译是报错 -source 1.5 中不支持 lambda 表达式. 错误原因: Maven Compiler 插件默认会加 -source ...
- AJPFX浅谈关于Java程序员缺乏面向对象的基本功的问题
为什么很多 Java 程序员会缺乏面向对象基本功?这得怪那些 Java 框架.现在 Java 的各种框架太发达.太傻瓜化了,导致很多程序员只需要按部就班.照着框架进行代码填空,基本已经丧失了 OOA ...
- 解决Android 打包为apk文件时已设置签名,在OPPO手机上安装时却出现“未设置签名”的错误
解决办法:
- BOM学习-javascript计时器小结
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- Mysql无法启动服务解决办法
只需要输入:mysqld --initialize 进行初始化,即可启动
- 超不清视频播放器-用Python将视频转成字符
前言 今天分享的这段代码,看起来没啥实际用处,而且有些反潮流,因为现如今大家看视频都追求更高分辨率的超清画质,而我们这个,是一个“超不清”的视频播放器:在控制台里播放视频,用字符来表示画面 不过我觉得 ...
- 骑芯供应链(T 面试)
1.目前市面上主流的团队开发模式是什么? 正解:DevOps,https://blog.csdn.net/bntX2jSQfEHy7/article/details/79168865 2.你觉得什么是 ...
- lodash中文说明文档
lodash中文说明文档 https://www.css88.com/doc/lodash/