POJ 3680 Intervals 最小费用最大流(MCMF算法)
题意:给出 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算法)的更多相关文章
- POJ-2516(最小费用最大流+MCMF算法)
Minimum Cost POJ-2516 题意就是有n个商家,有m个供货商,然后有k种商品,题目求的是满足商家的最小花费供货方式. 对于每个种类的商品k,建立一个超级源点和一个超级汇点.每个商家和源 ...
- POJ-2195(最小费用最大流+MCMF算法)
Going Home POJ-2195 这题使用的是最小费用流的模板. 建模的时候我的方法出现错误,导致出现WA,根据网上的建图方法没错. 这里的建图方法是每次到相邻点的最大容量为INF,而花费为1, ...
- 把人都送到房子里的最小花费--最小费用最大流MCMF
题意:http://acm.hdu.edu.cn/showproblem.php?pid=1533 相邻的容量为inf,费用为1,S到m容量为1,费用为0 ,H到T容量为1,费用为0. 建图跑-最小费 ...
- POJ 2195 - Going Home - [最小费用最大流][MCMF模板]
题目链接:http://poj.org/problem?id=2195 Time Limit: 1000MS Memory Limit: 65536K Description On a grid ma ...
- 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个区间所覆盖,请最大化总的区间权重. [题 ...
- 网络流--最小费用最大流MCMF模板
标准大白书式模板 #include<stdio.h> //大概这么多头文件昂 #include<string.h> #include<vector> #includ ...
- 最小费用最大流MCMF 最小增广
没有写单纯性的...应该不会有卡最小增广的出题人吧...(雾) struct MCMF{ struct tedge{int x,y,cap,flow,w,next;}adj[maxm];int ms, ...
- 最小费用最大流MCMF zkw费用流
稀疏图慢死了...但是稠密图效果还是很好的 struct MCMF{ struct tedge{int x,y,cap,w,next;}adj[maxm];int ms,fch[maxn]; int ...
随机推荐
- dubbo与trivial超时机制的深入思考
说在前面 trivial是根据之前设计的RPC框架而来的(还在增进当中),其中较为不同的一个点为,在客户端去掉了业务线程池,因为既然都要等待,不必要再加一层. 进入正题 有在网上看到这样的信息,“之前 ...
- iMX287A开发环境搭建
目录 1.开发套件简介 2.说明: 3.主机搭建交叉编译环境 4.编译第一个ARM Linux程序--Hello World 5.开发板运行U盘中的可执行文件 6.配置交叉编译工具到环境变量 7.sc ...
- JDBC大数据的采取
## JDBC的大类型数据的存取 ## # 基本概念: |-- 大文本类型数据和大二进制数据: 主要思想用于将大型的二进制数据(字节) 或是大型的文本数据(字符)从磁盘文件中读取 到数据库中,或是从数 ...
- python正则表达式之re模块使用
python第一个正则表达式 https://www.imooc.com/learn/550 r'imooc' Pattern Match result In [2]: import re In [ ...
- MongoDB Compass最新版(v_1.20.5)远程连接数据库
最近下载了最新版本的MongoDB Compass(v_1.20.5)后才发现软件较之前的版本有了很大的变化,主要体现在创建连接页面和连接方式上. 这是旧版的连接页面,所有的参数项以表单的形式列出,直 ...
- vue自定义指令要点
vue自定义指令的基础使用这里就不阐述,看官网文档:https://cn.vuejs.org/v2/guide/custom-directive.html 本文用一个实例描述自定义指令的要点,自定义一 ...
- vue项目开发,用webpack配置解决跨域问题
今天在本地开发时候碰到了跨域的问题,突然觉着跨域问题在所难免啊,之前没有没有碰到总觉着解决跨域很高大上的样纸,其实就是受限于网络的同源策略,跨域前后端都可以进行处理. 1,后端更改header hea ...
- 脚本写一行echo也能写出bug ? glob了解一下
背景 最近处理一个 bug 很有意思,有客户反馈某个配置文件解析失败了,出错的那行的内容就只有一个字母 a. 最开始以为是谁改动了处理的脚本,但要到了问题代码中的脚本,比较发现跟库上是一样的. 又经过 ...
- ECMAScript进化史(1):话说Web脚本语言王者JavaScript的加冕历史
互联网起火-Web时代的来临 在行文之前,反手就安利一下<浏览器史话中chrome霸主地位的奠定与国产浏览器的割据混战>. 浏览器始祖NCSA Mosaic在1993年1月发布(于1992 ...
- Kaggle 题目 nu-cs6220-assignment-1
Kaggle题目 nu-cs6220-assignment-1 题目地址如下: https://www.kaggle.com/c/nu-cs6220-assignment-1/overview 这是个 ...