题意:给出 n ,k 表示接下来给你 n 段开区间,每段区间都有它的权值,问选出一些区间,使它的权值最大,并且在实轴上的每个点,不得超过 k次被覆盖。

思路:首先要理解建图思路,首先有一个基图,相邻点之间都有边,花费为0,容量为 k,然后再根据所给数据 u,v, w 建图,u,v,加一条容量为 1,花费为 - w的边,求最大费用最大流,只需将权值变为负数即可求出最短路,相反数即为最大值。

最小费用最大流,就是用SPFA寻找最短路(增广路容量是否大于流量,花费最短路),然后用最大流方法去计算最大流量(容量限制)

理解一下最后画的图应该就懂了。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define N 220
int num[N],inf=0x3f3f3f3f;
struct node
{
int to,nextt;//下一个点 邻接表
int cap,flow,cost;//容量 流量 花费
} e[N*N]; //邻接表的next
bool book[N*2];
int a[N*2+5],tot,n,k,s,t,id[100010],l[N],r[N],w[N],dis[N*2],way[N*4],head[N*4];//最短距离 记录路径
/*邻接表存图*/
void add(int u,int v,int cap,int cost)
{
e[tot].to=v;
e[tot].cap=cap;
e[tot].cost=cost;
e[tot].flow=0;
e[tot].nextt=head[u];
head[u]=tot++; e[tot].to=u;
e[tot].cost=-1*cost;
e[tot].flow=0;
e[tot].cap=0;
e[tot].nextt=head[v];//正反建图
head[v]=tot++;
}
bool spfa()
{
// 寻找0~t的最短路
for(int i=0;i<=t;i++)
{
dis[i]=inf;
book[i]=0;
way[i]=-1;
}
book[s]=1;
dis[s]=0;
queue<int>q;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
book[u]=0;
for(int j=head[u];j!=-1;j=e[j].nextt)
{
int v=e[j].to;
if(e[j].cap>e[j].flow&&dis[v]>dis[u]+e[j].cost)//附加条件:当容量大于流量
{
dis[v]=dis[u]+e[j].cost;
way[v]=j;//记录边?
if(!book[v])
{
book[v]=1;
q.push(v);
}
}
}
}
if(dis[t]!=inf)//存在增广路可以到达 t
return 1;
return 0;
}
int MCMF()
{
int flow=0,cost=0;
while(spfa())
{
int minn=inf;
for(int i=way[t];i!=-1;i=way[e[i^1].to])
minn=min(minn,e[i].cap-e[i].flow);//找出最小花费
for(int i=way[t];i!=-1;i=way[e[i^1].to])
{
e[i].flow+=minn;
e[i^1].flow-=minn;//异或小技巧;1->2 2>1正反边
cost+=e[i].cost*minn;
}
flow+=minn;//计算最大流量?好像没用
}
return cost;
}
int main()
{
int z;
scanf("%d",&z);
while(z--)
{
scanf("%d%d",&n,&k);
int p=0;
memset(head,-1,sizeof(head));
for(int i=1; i<=n; i++)
{
scanf("%d%d%d",&l[i],&r[i],&w[i]);
a[++p]=l[i];
a[++p]=r[i];
}
sort(a+1,a+p+1);
tot=1;
/*重新编号 去重貌似有函数*/
id[a[1]]=tot++;
for(int i=2; i<=p; i++)
{
if(a[i]!=a[i-1])
id[a[i]]=tot++;
}
t=tot;
s=0;//起始点
// printf("%d %d\n",s,t);
// for(int i=1;i<=n;i++)
// printf("%d %d\n",id[l[i]],id[r[i]]);
tot=0;
for(int i=0;i<=t;i++)
add(i,i+1,k,0);
for(int i=1;i<=n;i++)
add(id[l[i]],id[r[i]],1,-w[i]);//为什么是负权
printf("%d\n",MCMF()*-1);
}
return 0;
}

POJ 3680 Intervals 最小费用最大流(MCMF算法)的更多相关文章

  1. POJ-2516(最小费用最大流+MCMF算法)

    Minimum Cost POJ-2516 题意就是有n个商家,有m个供货商,然后有k种商品,题目求的是满足商家的最小花费供货方式. 对于每个种类的商品k,建立一个超级源点和一个超级汇点.每个商家和源 ...

  2. POJ-2195(最小费用最大流+MCMF算法)

    Going Home POJ-2195 这题使用的是最小费用流的模板. 建模的时候我的方法出现错误,导致出现WA,根据网上的建图方法没错. 这里的建图方法是每次到相邻点的最大容量为INF,而花费为1, ...

  3. 把人都送到房子里的最小花费--最小费用最大流MCMF

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=1533 相邻的容量为inf,费用为1,S到m容量为1,费用为0 ,H到T容量为1,费用为0. 建图跑-最小费 ...

  4. POJ 2195 - Going Home - [最小费用最大流][MCMF模板]

    题目链接:http://poj.org/problem?id=2195 Time Limit: 1000MS Memory Limit: 65536K Description On a grid ma ...

  5. POJ 3680 Intervals(费用流)

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

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

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

  7. 网络流--最小费用最大流MCMF模板

    标准大白书式模板 #include<stdio.h> //大概这么多头文件昂 #include<string.h> #include<vector> #includ ...

  8. 最小费用最大流MCMF 最小增广

    没有写单纯性的...应该不会有卡最小增广的出题人吧...(雾) struct MCMF{ struct tedge{int x,y,cap,flow,w,next;}adj[maxm];int ms, ...

  9. 最小费用最大流MCMF zkw费用流

    稀疏图慢死了...但是稠密图效果还是很好的 struct MCMF{ struct tedge{int x,y,cap,w,next;}adj[maxm];int ms,fch[maxn]; int ...

随机推荐

  1. node中fs模块 - fs.open() fs.read() fs.write() fs.close()

    var fs = require('fs') fs.open('./a.txt', 'a+', function(err, fd) { // 打开文件后 创建缓冲区放置数据 ), // 读取多少字节 ...

  2. 前端开发--vue开发部分报错指南

    前期开发过程中 [Vue warn]: Error in render: "TypeError: Cannot read property '0' of undefined". 解 ...

  3. 关于Java序列化的问题你真的会吗?

    引言 在持久化数据对象的时候我们很少使用Java序列化,而是使用数据库等方式来实现.但是在我看来,Java 序列化是一个很重要的内容,序列化不仅可以保存对象到磁盘进行持久化,还可以通过网络传输.在平时 ...

  4. 必备技能六、Vue框架引入JS库的正确姿势

    在Vue.js应用中,可能需要引入Lodash,Moment,Axios,Async等非常好用的JavaScript库.当项目变得复杂庞大,通常会将代码进行模块化拆分.可能还需要跑在不同的环境下,比如 ...

  5. HDFS 客户端读写操作详情

    1. 写操作 客户端向namenode发起上传请求 namenode检查datanode是否已经存有该文件,并且检查客户端的权限 确认可以上传后,根据文件块数返回datanode栈 注:namenod ...

  6. 三维GIS引擎地图可视化渲染方案设计

    1.GIS地图可视化流程 GIS地图可视化就是将空间数据转化为地图数据再进行交互处理的方法,下图一展示了地图可视化的可编程渲染的典型管道,原始空间数据必须处理为图形API支持基础图元用以地图渲染.下图 ...

  7. Python学习字典.基础三

    元组   Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组中要定义的元组中只有一个元素需要再元素后面加逗号,用来消除数学歧义.例 t=(1,)   ...

  8. golang 交叉编译 win开发 linux生产

    windows平台之下使用 go env 能看到go本身的配置的环境变量,其中红框框起来的变量是交叉编译需要改动的选项, 由于是win平台开发,但是跑起来的程序都是在linux,所以linux转win ...

  9. eclipse代码提示完善

    转载请注明出处:https://www.cnblogs.com/Higurashi-kagome/p/12263267.html 1.参考https://blog.csdn.net/ithomer/a ...

  10. mysql实现读写分离

    MySQL读写分离概述 1.读写分离介绍 对于目前单机运行MySQL服务.会导致MySQL连接数过多.最终导致mysql的宕机.因此可以使用多台MySQL服务器一起承担压力.考虑到项目中读写比例的不一 ...