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 ...
随机推荐
- datatables异步获取数据、简单实用
IKC项目总结 一.认证难题管理模块 1. 如何使用datatables进行获取数据内容 datatables简介:Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何H ...
- 身为 Java 程序员必须掌握的 10 款开源工具!
本文主要介绍Java程序员应该在Java学习过程中的一些基本和高级工具.如果你是一位经验丰富的Java开发人员,你可能对这些工具很熟悉,但如果不是,现在就是是开始学习这些工具的好时机.Java世界中存 ...
- Scrum模拟微信看一看“疫情专区”的敏捷开发过程
无论作为产品用户还是管理咨询顾问,都非常非常喜欢微信.自认感情比较克制属于“高冷”挂,但从很多方面都太佩服太崇拜张小龙了(新书里微信也会是最喜欢的案例之一,真的不只是一个产品而已,很多方面都太牛了). ...
- 【算法记事本#NLP-1】最大匹配算法分词
本文地址:https://www.cnblogs.com/oberon-zjt0806/p/12409536.html #NLP-1 最大匹配算法(MM) 最大匹配算法(Maximum Matchin ...
- 工作技术点小计14条 hybrid + animate 方向
设置transition 动画的时候 , js直接设置duration 和 变化值不会起作用 , 需要先设置duration , 等一小会再设置变化值 安卓端 , 窗口不可见时 , window.in ...
- Slog62_项目上线之ArthurSlog个人网站上线1
ArthurSlog SLog-62 Year·1 Guangzhou·China September 9th 2018 GitHub NPM Package Page ArthurSlog Page ...
- 前端每日实战:42# 视频演示如何用纯 CSS 创作一个均衡器 loader 动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oybWBy 可交互视频教程 此视频 ...
- 前端javascript知识(一)
介绍一下 JS 的基本数据类型. Undefined.Null.Boolean.Number.String 介绍一下 JS 有哪些内置对象. Object 是 JavaScript 中所有对象的父对象 ...
- WinPcap vs Npcap
1.两者都一直有人在维护,而并不是nmap官网介绍的已经停止维护了,https://nmap.org/npcap/vs-winpcap.html 2.Wireshark默认使用WinPcap,他无法抓 ...
- 续python学习(一)
接上面没写完的知识点继写. 当然,这些知识点都很简单,可能没必要花费太多时间去记忆,多写写代码就会了. 5.字符串的使用.索引和切片是字符串主要的两个应用.索引:顾名思义就是找出某个字符在一个字符串中 ...