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 ...
随机推荐
- LeetCode--二叉树2--运用递归解决树的问题
LeetCode--二叉树2--运用递归解决树的问题 在前面的章节中,我们已经介绍了如何利用递归求解树的遍历. 递归是解决树的相关问题最有效和最常用的方法之一. 我们知道,树可以以递归的方式定义为一个 ...
- 2020年,MyBatis常见面试题总结
Mybatis 技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用 Mybatis 的文章,所以,一些参数使用细节略掉了,我们的目标 ...
- PHP算法练习2:(175. 组合两个表)
练习地址:https://leetcode-cn.com/problems/combine-two-tables/ 表1: Person +-------------+---------+ | 列名 ...
- JMeter-WebService接口的测试
前言 JMeter3.2版本之后就没有SOAP/XML-RPC Request插件了,那么该如何进行webservice接口的测试呢? 今天我们来一起学习一下怎么在3.2以后版本的JMeter进行we ...
- 正式学习MVC 05
1.剃须刀模板razor的使用 1)混编 循环语法 @model List<MVCStudy.Models.Student> @{ ViewBag.Title = "List&q ...
- Python - loguru日志库,高效输出控制台日志和日志记录
一.安装loguru loguru的PyPI地址为:https://pypi.org/project/loguru/ GitHub仓库地址为:https://github.com/Delgan/log ...
- 关于Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析
1.Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service和 @Controller 其实这三个跟@Com ...
- 写react项目要注意的事项
1,className一定是大写字母开头,例如:App-logo,App,App-header. 2,有关react元素的更新,唯一办法是创建新元素,然后重新将其传入ReactDOM.render() ...
- ES6语法:var、let、const的区别详解
今天来说说es6的语法,最基础的也就是var,let,const 的用法与区别了,我们来看看他们之间的恩怨情仇. 首先来说说var,这个只要是学过js的都知道,它是用来声明一个变量的,但是它在开发中也 ...
- Redis05——Redis Cluster 如何实现分布式集群
前面一片文章,我们已经说了Redis的主从集群及其哨兵模式.本文将继续介绍Redis的分布式集群. 在高并发场景下,单个Redis实例往往不能满足业务需求.单个Redis数据量过大会导致RDB文件过大 ...