[bzoj1497][NOI2006]最大获利_网络流_最小割
最大获利 bzoj-1497
题目大意:可以建立一个点,花费一定的代价;将已经建立的两个点之间连边,得到一定收益。有些节点之间是不允许连边的。
注释:1<=点数<=5,000,1<=允许连边的边数<=50,000。
想法:将每个可以相连的点之间的边在网络流里建立成一个节点,将源点连这条边的收获,向这两条边的端点分别连两条inf的边,所有的端点向源点连边权为该点代价的边。然后由最大流等于最小割,求最大流即可。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
int head[400010],to[400010],nxt[400010],tot=1;
int dis[400100];
int n,m;
// int p[10010];
int f[400010];
inline void add(int x,int y,int z)
{
to[++tot]=y;
f[tot]=z;
nxt[tot]=head[x];
head[x]=tot;
}
bool bfs()
{
queue<int> q;
memset(dis,-1,sizeof dis);
q.push(1);dis[1]=0;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=head[x];i;i=nxt[i])
{
if(f[i]>0&&dis[to[i]]==-1)
{
dis[to[i]]=dis[x]+1;
q.push(to[i]);
if(to[i]==n+m+2) return true;
}
}
}
return false;
}
int dinic(int x,int flow)
{
int a,temp=flow;
if(x==n+m+2) return flow;
for(int i=head[x];i;i=nxt[i])
{
if(f[i]>0&&dis[to[i]]==dis[x]+1)
{
a=dinic(to[i],min(f[i],temp));
if(!a) dis[to[i]]=-1;
temp-=a;
f[i]-=a;
f[i^1]+=a;
if(!temp) break;
}
}
return flow-temp;
}
int main()
{
cin >> n >> m;
int all=n+m+2;
for(int a,i=1;i<=n;i++)
{
cin >> a;
add(1+m+i,all,a);
add(all,1+m+i,0);
}
int sum=0;
for(int a,b,c,i=1;i<=m;i++)
{
cin >> a >> b >> c;
sum+=c;
add(1,1+i,c);add(1+i,1,0);
add(1+i,1+m+a,inf);add(1+m+a,1+i,0);
add(1+i,1+m+b,inf);add(1+m+b,1+i,0);
}
int ans=0;
while(bfs())
{
// puts("Fuck");
ans+=dinic(1,inf);
}
cout << sum - ans << endl;
return 0;
}
小结:最小割等于最大流
[bzoj1497][NOI2006]最大获利_网络流_最小割的更多相关文章
- 【BZOJ2229】[ZJOI2011]最小割(网络流,最小割树)
[BZOJ2229][ZJOI2011]最小割(网络流,最小割树) 题面 BZOJ 洛谷 题解 戳这里 那么实现过程就是任选两点跑最小割更新答案,然后把点集划分为和\(S\)联通以及与\(T\)联通. ...
- 【CF331E】Biologist(网络流,最小割)
[CF331E]Biologist(网络流,最小割) 题面 洛谷 翻译: 有一个长度为\(n\)的\(01\)串,将第\(i\)个位置变为另外一个数字的代价是\(v_i\). 有\(m\)个要求 每个 ...
- 【BZOJ1391】Order(网络流,最小割)
[BZOJ1391]Order(网络流,最小割) 题面 BZOJ权限题... 良心洛谷 题目描述 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成 ...
- 【BZOJ3144】切糕(网络流,最小割)
[BZOJ3144]切糕(网络流,最小割) 题面 BZOJ 题解 这样的类型很有趣 先不考虑相邻距离差不能超过\(D\)的限制 我们考虑答案,显然就是在每个位置选一个最小的高度割就行了 化成最小割的模 ...
- BZOJ1497 [NOI2006]最大获利 网络流 最小割 SAP
原文链接http://www.cnblogs.com/zhouzhendong/p/8371052.html 题目传送门 - BZOJ1497 题意概括 有n个站要被建立. 建立第i个站的花费为pi. ...
- BZOJ1497: [NOI2006]最大获利[最小割 最大闭合子图]
1497: [NOI2006]最大获利 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 4375 Solved: 2142[Submit][Status] ...
- [bzoj2561]最小生成树_网络流_最小割_最小生成树
最小生成树 bzoj-2561 题目大意:题目链接. 注释:略. 想法: 我们发现: 如果一条权值为$L$的边想加入到最小生成树上的话,需要满足一下条件. 就是求出原图的最小生成树之后,这个边当做非树 ...
- [bzoj4519][Cqoi2016]不同的最小割_网络流_最小割_最小割树
不同的最小割 bzoj-4519 Cqoi-2016 题目大意:题目链接. 注释:略. 想法: 我们发现这和最小割那题比较像. 我们依然通过那个题说的办法一样,构建最小割树即可. 接下来就是随便怎么处 ...
- [bzoj3894]文理分科_网络流_最小割
文理分科 bzoj-3894 题目大意:题目链接. 注释:略. 想法: 这种题也是一种套路. 我们新建一个点表示收益点. 然后把所有的收益都加一起,求最小割表示代价即可. Code: #include ...
随机推荐
- HighCharts之2D圆环图
HighCharts之2D圆环图 1.实例源码 Donut.html: <!DOCTYPE html> <html> <head> <meta charset ...
- RAID10与RAID01比较,RAID10与RAID5比较
RAID10和RAID01的比较RAID10是先做镜象,然后再做条带. RAID01则是先做条带,然后再做镜象. 比如以6个盘为例,RAID10就是先将盘分成3组镜象,然后再对这3个RAID1做 ...
- html基础加强2
1.表单元素 表单元素一定要提交在form标签里面 2.id和name 所有元素都有ID,但只有表单元素才有name ID不可以重复,name可以重复 name属性的目的时可以将数据提交到服务器.id ...
- 护航者,腾讯云: 2017年度游戏行业DDoS态势报告—回溯与前瞻
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯游戏云 前言 自14年开始,全球DDoS攻击持续爆发,攻击峰值不断创记录.2017年,这种依靠超大流量不断冲击服务器和带宽造成业务 ...
- C#图解教程 第二十四章 反射和特性
反射和特性 元数据和反射Type 类获取Type对象什么是特性应用特性预定义的保留的特性 Obsolete(废弃)特性Conditional特性调用者信息特性DebuggerStepThrough 特 ...
- link-cut-tree 简单介绍
link-cut-tree 简单介绍 前言:这个算法似乎机房全都会,就我不会了TAT...强行搞了很久,勉强照着别人代码抄了一遍qwq 这个本人看论文实在看不懂,太菜了啊!!! 只好直接看如何实现.. ...
- 洛谷P4219 [BJOI2014]大融合(LCT,Splay)
LCT维护子树信息的思路总结与其它问题详见我的LCT总结 思路分析 动态连边,LCT题目跑不了了.然而这题又有点奇特的地方. 我们分析一下,查询操作就是要让我们求出砍断这条边后,x和y各自子树大小的乘 ...
- (luogu P1594)护卫队[TPLY]
(luogu P1594) 护卫队 题目链接 https://www.luogu.org/problemnew/show/P1594 很好的一个模型 题目大意 有一个有序的车队,要求将其分成若干段,每 ...
- 【BZOJ4071】八邻旁之桥(线段树)
[BZOJ4071]八邻旁之桥(线段树) 题面 BZOJ权限题,洛谷链接 题解 既然\(k<=2\) 那么,突破口就在这里 分类讨论 ①\(k=1\) 这...不就是中位数吗.... 直接把所有 ...
- java 实现登录验证码 (kaptcha 验证码组件)
验证码的作用: 1.防止广告机注册和发帖.评论.2.防止暴力破解密码,特别是有管理员权限的密码. 在这里介绍一种非常实用的验证码生成工具:kaptcha 这个工具,可以生成各种样式的验证码,因为它是可 ...