题目大意:你有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【最小费用最大流】的更多相关文章

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

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

  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. 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 ...

  5. poj 3680 Intervals(费用流)

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

  6. poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙

    /** 题目:poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙 链接:http://poj.org/problem?id=3680 题意:给定n个区间,每个区间(ai,bi ...

  7. POJ 2195:Going Home(最小费用最大流)

    http://poj.org/problem?id=2195 题意:有一个地图里面有N个人和N个家,每走一格的花费是1,问让这N个人分别到这N个家的最小花费是多少. 思路:通过这个题目学了最小费用最大 ...

  8. poj 2195 二分图带权匹配+最小费用最大流

    题意:有一个矩阵,某些格有人,某些格有房子,每个人可以上下左右移动,问给每个人进一个房子,所有人需要走的距离之和最小是多少. 貌似以前见过很多这样类似的题,都不会,现在知道是用KM算法做了 KM算法目 ...

  9. POJ 2157 Evacuation Plan [最小费用最大流][消圈算法]

    ---恢复内容开始--- 题意略. 这题在poj直接求最小费用会超时,但是题意也没说要求最优解. 根据线圈定理,如果一个跑完最费用流的残余网络中存在负权环,那么顺着这个负权环跑流量为1那么会得到更小的 ...

  10. POJ 2195 Going Home(最小费用最大流)

    http://poj.org/problem?id=2195 题意 :  N*M的点阵中,有N个人,N个房子.让x个人走到这x个房子中,只能上下左右走,每个人每走一步就花1美元,问当所有的人都归位了之 ...

随机推荐

  1. 关于提示replication性能

    关于GTIDs的二进制日志:gtid_next: 下一个事务的编号,是master传给slave的 如SET @@SESSION.GTID_NEXT= 'c09756b8-a7e7-11e5-9468 ...

  2. ABP教程(四)- 开始一个简单的任务管理系统 - 实现UI端的增删改查

    接上一篇:ABP教程(三)- 开始一个简单的任务管理系统 – 后端编码 1.实现UI端的增删改查 1.1添加增删改查代码 打开SimpleTaskSystem.sln解决方案,添加一个“包含视图的MV ...

  3. 基于Java实现的冒泡排序算法

    冒泡排序是一种简单基础的排序算法,相信在大学课堂里老师已经讲过了,现在我基于Java来实现一遍. 简述 冒泡排序正如其关键词一样,杂乱的气泡经过浮动,最后大的气泡飘到了上面而小的气泡在下面,无序的元素 ...

  4. grunt配置详情

    这个grunt配置 是我的一个程序员朋友从网上无意间看到的,然后他亲测了下,恩,是可以的.不过我到目前还未测试过是否可以. 一.安装node, 首先确保电脑已有node的环境.然后 运行  npm i ...

  5. jquery实现上传图片及图片大小验证、图片预览效果代码

    jquery实现上传图片及图片大小验证.图片预览效果代码 jquery实现上传图片及图片大小验证.图片预览效果代码 上传图片验证 */ function submit_upload_picture() ...

  6. Python behave in BDD

    BDD概念 全称 Behavior-driven development 中文 行为驱动开发 概念 是敏捷软件开发技术的一种,鼓励各方人员在一个软件项目里交流合作,包括开发人员.测试人员和非技术人员或 ...

  7. centos设置系统时间

    系统日期设定成1996年6月10日上午9点date -s 06/22/96date -s 09:00:00

  8. Python学前基础知识

    Python基础计算机常识:硬件性能:CPU.内存输入设备:鼠标.键盘外部存储设备:硬盘输出设备;显示器.打印机(不算自带)通讯设备:无线网卡----------------------------- ...

  9. MongoDB最简单的入门教程之五-通过Restful API访问MongoDB

    通过前面四篇的学习,我们已经在本地安装了一个MongoDB数据库,并且通过一个简单的Spring boot应用的单元测试,插入了几条记录到MongoDB中,并通过MongoDB Compass查看到了 ...

  10. Eclipse--java.lang.OutOfMemoryError: PermGen space

    这一段时间,Eclipse总是死掉,几乎是稍微操作快一点就会死掉,几分钟一次,搞得人郁闷至极.浪费了不少时间,在网上搜了下,看到很多朋友也出现类似的情况,在网上求救,但是网上的办法都只是说通过修改ec ...